关于NodeJs服务端请求错误日志的记录

目前的服务端错误处理

服务端使用NodeJs的restify作为app的rest服务接口,用restify的好处是没有太多框架的东西,能更好的控制服务端的代码逻辑。

关于错误日志记录,目前是使用在route的handler里面使用try catch,如果不这样做的话服务端的错误就会暴露给客户端,从安全和体验的角度上看都是不友好的。不没有捕获的错误restify是会这样处理的:

res.send(err); //在中间件中调用next(err)是一样的效果

目前项目使用log4j记录日志,一般用法是:

var logger = getLogger('requestUrl')
logger.warn(err.stack);

除了出错信息,还带上了初始化logger时的信息requestUrl,当然信息可以自定义,例如来自某某操作的日志

不足之处

  1. 代码冗余(业务分散),例如每个handler里面都要require logger,都要实行try catch机制。
  2. 日志信息不全,缺少请求对象的详细信息

更好的错误日志处理方案

先看看restify的文档

http://mcavage.me/node-restify/#server-api-2

文档中给出了各种事件,下面代码就用uncaughtException为例子说明如何更好的处理错误, 例子吧当前请求的路径和错误都打印出来,还可以吧请求对象保存起来,放在MongoDB里面瞬间查找高大上了有没有。。。

server.on('uncaughtException', function (req, res, route, err) {
    console.log(route);     // log the route, woo...
    console.log(err.stack); // log the error
    var message = 'WTF';
    if (err instanceof MyError) {
        message = err.message; // custom output message, cool
    }
    res.send(400, { message: message }); // status code can depend on the Error Type
});

完整代码请参考
https://gist.github.com/calvinxiao/ada4a6f4314acd984246

你可能感兴趣的:(关于NodeJs服务端请求错误日志的记录)