目前的服务端错误处理
服务端使用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
,当然信息可以自定义,例如来自某某操作的日志
不足之处
- 代码冗余(业务分散),例如每个handler里面都要require logger,都要实行
try catch
机制。 - 日志信息不全,缺少请求对象的详细信息
更好的错误日志处理方案
先看看restify的文档
文档中给出了各种事件,下面代码就用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