我阅读了Joyent的死后调试文章和我们使用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});
});..。或者,对于日志记录和报告错误是否还有其他标准做法(这基本上意味着保存堆栈跟踪?)
发布于 2015-05-04 02:15:08
(1)我是否应该使用bunyan记录在我的应用程序中发生的每一个动作?
是的,基本上。有一些更好的点,但基本上你想做一个良好的信号/噪声权衡,同时保持合理的可能性,成功的死后调试。记录太多从不失败的代码路径,您就会淹没在噪音中。不要进行足够的日志记录,你可能真的不知道是什么导致了一个问题。别太担心这件事。这是一种只有通过经验才能获得的感觉,从日志分析中可以很容易地看出,您在哪里产生噪音,并且可以在事实发生后将其调下来或过滤掉,而且您有大量复杂的代码正在执行,没有记录任何细节,您需要在那里添加更多日志记录。
(2)如果是这样的话,我就不会得到不相交的日志输出了吗?
是的,但没关系。您可以使用后处理工具将它们重新连接到一个更连贯的叙述中。常见技术包括记录每个请求的唯一请求ID以及sessionID。这样,您就可以过滤单个用户的会话,或者只过滤一个有趣的请求。
(3)我是否应该用bunyan来记录堆栈痕迹?
是的,但是bunyan包含用于错误实例的标准序列化程序,所以只需将属性命名为err并启用标准序列化程序,您就会得到正确记录的错误消息和堆栈跟踪。
https://stackoverflow.com/questions/30021466
复制相似问题