使用BAE本地日志系统来定位错误 – node.js篇

在互联网时代,我们的代码都是部署在远程,而且还有可能同时被好几个实例运行。这样的情况使得使用调试器的代价变得非常大。因此,查看log成为了我们最主要的调试手段。

这里,我们以node.js为例,来说明BAE中的本地日志系统是如何帮助我们查找错误的。

node.js中,最简单的打印log的语句莫过于console.log(…)了。按照惯例,每一个函数的入口都应该有log。而且在错误发生的时候,应该使用console.error(…)来记录每一个错误。

让我们来看一段代码。

console.log("The server is listening on port 18080.");

http.createServer(function(request, res) {

    console.log("user request.");

    var db = new Db(db_name, new Server(db_host, db_port, {}), { w: 1 });

    console.log("Open mongo database. Database host: " + db_host + ", database port: " + db_port + ", database name: " + db_name);

    db.open(function(err, db) {

        if (err) {

            console.error(err);

            res.end('Open mongo database failed!');

            return;

        }

        console.log("Authenticate mongo database.");

        db.authenticate(username, password, function(err, result) {

            if (err) {

                console.error(err);

                db.close();

                res.end('Authentication failed!');

                return;

            }

            res.end('Succeeded.');

        });

    });

}).listen(18080);

这段代码一开始,就打印了一行log。内容是:“The server is listening on port 18080.”当我们把这段代码部署到BAE之后,在BAE的“查看日志”页面里,查询userapp.log,就能够看到这一行log

 

当用户访问这个服务器之后,再次查询userapp.log,就能够看到更多的log输出,尤其是错误输出。

 

从上面的log中,我们发现了错误信息。但是对于开发者来说,我们更关心的是在哪一行出了错。当然,我们可以在代码中搜索已打印的log来大致定位错误。不过如果在log中直接就有错误的准确位置,那就可以大大减少我们追踪代码的时间。

这时,node.jsconsole.trace()就可以帮助我们定位错误。我们在console.error(…)的下面加上console.trace(),然后重新部署。现在的log看起来就是这样的:

 

我们在调用栈上发现了这么一行log#at /home/bae/app/test.js:32:25。于是我们就知道了错误的具体位置,为test.js的第32行:

 

32行是一个console.trace()。这条语句被db.authenticate(…)的回调函数调用。因此我们立刻就知道是db.authenticate(…)出错了。

我们也可以使用异常来进行错误处理。但是如果希望node.js打印出调用栈的话,异常必须是Error类型。因此这条语句无法定位错误:”throw err;”,而这样就能定位错误:”throw new Error(‘some error’);”

最后,本文的内容可以总结为以下几点:

  1. 可以借助BAE本地日志系统来调试BAE
  2. node.js中,我们使用console.log()console.error()来记录日志和错误信息。我们还使用console.trace()来打印调用栈。
  3. node.js中,如果希望打印异常的调用栈,则必须抛出Error类型的异常。
此条目发表在 BAE使用 分类目录。将固定链接加入收藏夹。

发表评论