3

我阅读了 Joyent 的事后调试文章,他们建议我们使用 bunyan。

他们讨论了日志信息的质量如何非常重要,并且可以帮助解决出现的错误。然后有一些外部博客网站展示了如何在他们的 Nodejs 应用程序中安装和运行 bunyan,这很好。

但我是新手,对如何有效使用日志记录一无所知(无论是特定于 bunyan 还是一般的日志记录实践)。我有三个相互关联的问题。

(1) 我应该使用 bunyan 来记录我的应用程序中发生的每一个动作吗?

IE,

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});
});

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

4

1 回答 1

6

(1) 我应该使用 bunyan 来记录我的应用程序中发生的每一个动作吗?

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

(2) 如果是这样,那么我不会得到不连贯的日志输出吗?

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

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

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

于 2015-05-04T02:15:08.303 回答