使用 nodejs bunyan 正确记录错误?

Properly logging errors with nodejs bunyan?

我通读了 Joyent 的事后调试文章 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) Am I supposed to use bunyan to log every action that happens in my application?

是的,基本上。这有一些更好的要点,但基本上你想在保持事后调试成功的合理可能性的同时做出良好的 signal/noise 权衡。记录太多关于永不失败的代码路径,你会淹没在噪音中。日志记录不够多,您可能对导致问题的原因一无所知。不要太担心这个。这是一种你只有通过经验才能获得的感觉,从日志分析中很容易看出你在哪些地方产生了噪音,并且可以在事后调低或过滤掉它,以及在哪些地方执行了大量复杂的代码而没有记录任何细节,并且您需要在那里添加更多日志记录。

(2) If so, then wouldn't I get log output in disjointed pieces?

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

(3) Should I be using bunyan to log stacktraces?

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