使用nodejs bunyan正确记录错误?

rub*_*lex 3 error-handling logging node.js express bunyan

我阅读了Joyent的postmortem调试文章,他们建议我们使用bunyan.

他们讨论了日志信息的质量如何非常重要,并有助于在出现错误时解决错误.然后有外部博客网站显示如何在他们的Nodejs应用程序中安装和运行bunyan,这很不错.

但我是如何有效地使用日志记录(一般都是针对bunyan和日志记录实践)的新手.我有三个相互关联的问题.

(1)我是否应该使用bunyan来记录我的申请中发生的每一个动作?

router.post('/submit', function(req, res) {
    log.info({ req:req }, req.user.name + ' has called /submit');

    saveData(req)
    .then(function(data) {
        log.info({data: data}, req.user.name + ' has saved to DB successfully in /submit');
        res.json({'success': 'Saved!'});
    })
    .error(function(err) {
        log.error({ err: err }, req.user.name + ' has caused an error in /submit ');
        res.status(500).json("error": err});
    }); 
});
Run Code Online (Sandbox Code Playgroud)

...... 在我的申请中到处都是这样的?

(2)如果是这样,那么我不会以脱节的方式得到日志输出吗?例如,如果我们有3个并发用户呼叫/submit,则消息可以是:

Alice has called /submit
Bob has called /submit
Alice has caused an error in /submit
Carol has called /submit
Bob has saved to DB successfully in /submit
Carol has saved to DB successfully in /submit
Run Code Online (Sandbox Code Playgroud)

是对的吗?如果我有一个堆栈跟踪,Bob并且我试图在程序崩溃之前获得系统状态的先验知识,我将不得不以某种方式过滤掉其他所有人并按时间戳排序以获得一致的事件顺序Bob

(3)我应该使用bunyan来记录堆栈跟踪吗?即,添加err.stack到bunyan记录器:

.error(function(err) {
    log.error({ err: err, stacktrace: err.stack }, req.user.name + ' has caused an error in /submit ');
    res.status(500).json("error": err});
});
Run Code Online (Sandbox Code Playgroud)

...或者是否有一些其他标准做法来记录和报告错误(这基本上意味着保存堆栈跟踪?)?

Pet*_*ons 5

(1)我是否应该使用bunyan来记录我的申请中发生的每一个动作?

是的,基本上.有一些更好的点,但基本上你想做出良好的信号/噪声权衡,同时保留成功的事后调试的合理可能性.记录太多关于永不失败的代码路径并且你淹没在噪音中.没有足够的记录,你可以毫无必要地解决导致问题的原因.不要为此烦恼太多.这是一种你只能获得经验的感觉,从日志分析中可以很容易地看到你在产生噪音的地方,可以调低内容或者在事实之后将其过滤掉,并且你有一大堆复杂的代码执行而没有记录细节和你需要在那里添加更多的日志记录.

(2)如果是这样,那么我不会以脱节的方式得到日志输出吗?

是的,但没关系.您使用后处理工具将它们重新连接成更连贯的叙述.常用技术包括记录每个请求的唯一请求ID以及sessionID.这样,您可以过滤单个用户的会话或仅过滤一个有趣的请求.

(3)我应该使用bunyan来记录堆栈跟踪吗?

是的,但是bunyan包含用于Error实例的标准序列化程序,因此只需命名该属性err并启用标准序列化程序,您将获得正确记录的错误消息和堆栈跟踪.

  • 是。唯一的变化是`log.error({err:err})`-仅传递整个错误实例,而不访问`.stack`属性。 (2认同)