我阅读了 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});
});
...或者是否有其他一些标准做法来记录和报告错误(这基本上意味着保存堆栈跟踪?)?