使用nodejs bunyan正确记录错误?

时间:2015-05-04 01:47:17

标签: node.js logging express error-handling bunyan

我通过Joyent的postmortem调试文章阅读,they recommended我们使用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});
    }); 
});

...在我的应用程序中到处等等?

(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

是吗?如果我有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});
});

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

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

  

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

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