bunyan log.child正确的用例?

我一直在看bunyanlogin我的nodejs应用程序。 我试了一下,似乎一切工作都很好。 我已经跳过了一个关于log.child 的部分 ,但现在我正在尝试了解如何使用它。 我认为这样做的目的是让我为日志条目指定一些特殊的标识符,以便我可以唯一地标识该日志如何与其他日志条目相关联。

如果是这样的话,我会设想自己在每个请求中使用log.child

 var bunyan = require('bunyan'); var log = bunyan.createLogger({name: 'myapp'}); router.post('/submit', function(req, res) { var logChild = log.child({reqId: uuid.v4()}); logChild.info({ req:req }, req.user.name + ' has called /submit'); saveData(req) .then(function(data) { logChild.info({data: data}, req.user.name + ' has saved to DB successfully in /submit'); res.json({'success': 'Saved!'}); }) .error(function(err) { logChild.error({ err: err }, req.user.name + ' has caused an error in /submit '); res.status(500).json("error": err}); }); }); 

这样,如果用户Bob在30秒内发送/submit两次,则会在日志文件中区分两个不同的调用。

也就是说,我会看到类似的情况(与上下文):

 Bob has called /submit uuid: 109156be-c4fb-41ea-b1b4-efe1671c5836 Bob has called /submit uuid: 49dlsd7i-dapd-fdio-fei0-sd59fd0ph34d Bob has saved to DB successfully in /submit uuid: 109156be-c4fb-41ea-b1b4-efe1671c5836 Bob has caused an error in /submit uuid: 49dlsd7i-dapd-fdio-fei0-sd59fd0ph34d 

而不是这个(没有上下文):

 Bob has called /submit Bob has called /submit Bob has saved to DB successfully in /submit Bob has caused an error in /submit 

因此,对于我的Nodejs应用程序中的所有路由,我将创buildlogChild对象,然后使用logChildlogging该路由中的条目。

我是否正确理解执行 log.child的用例?

你似乎适当地使用log.child。 我可以提供一个build议来帮助您“唯一地识别该日志如何与其他日志条目关联”,方法是将log附加到req对象。 这样,如果您有不同的中间件,则可以从多个位置使用相同的唯一标识访问同一个logging器。 例如:

 var log = bunyan.createLogger({name: 'myapp'}); router.use(function(req, res, next) { req.log = log.child({ user : req.user.id }); }); router.post('/submit', function(req, res) { req.log.info('submitted request at ' + Date.now()); }); 

您现在将在日志中看到{ user : some_user_id, msg: 'submitted request at 01/03/15' } ,这使您可以使用req.log对象将请求链中的任何中间件绑定到单个用户。