将Bunyan应用于大型节点应用程序的推荐方法



我正在开发一个具有多个模块的节点应用程序。我现在正在尝试正确设置日志记录(应该在一开始就这样做),并考虑使用Bunyan。

最好是像本答案中建议的那样,导出一个logger模块,然后其他模块需要它,还是直接在每个模块中定义一个新的bunyan logger实例并相应地配置它?对于重用,我想象前者,但我不知道这是否会限制未来。

如果我有一个像一样定义的单一记录器

var bunyan        = require('bunyan');
var logger = bunyan.createLogger({
   name: "filter",
   streams: [
      {
         level: 'info',
         stream: process.stdout
      },
      {
         level: 'error',
         path: '../error.log'
      },
      {
         level: 'debug',
         path: '../debug.log'
      }
   ]
});
module.exports = logger;

然后,所有使用它的模块也将使用名称filter进行日志记录,而对于每个模块来说,使用更能代表其自身的名称进行日志记录可能更有意义。

此外,我认为所有模块都应该将错误记录到同一日志文件中,例如systemErr.log(以便更好地概述),还是应该记录到自己的错误日志中,例如module1Err.log、module2Err.log,这是对的?

最好是有一个导出的记录器模块,然后由其他模块要求

。越简单越好。这也避免了日志设置的样板重复。

此外,我认为所有模块都应该将错误记录到同一日志文件中,例如systemErr.log(以便更好地概述),还是应该记录到自己的错误日志中,例如module1Err.log、module2Err.log,这是对的?

整个应用程序的一个文件。因为bunyan使用ndjson格式,所以在需要的时候过滤主日志文件非常容易。我建议直接向stdout日志记录的简单性和灵活性,并允许部署环境决定它应该去哪里。这对于您可能不需要或不希望磁盘上的日志文件的开发也很方便。像upstartmultilog这样的工具可以正确地将stdout日志写入磁盘,并为您处理日志轮换。

一个额外的提示。在本地开发时,我用这样的东西运行我的应用程序:

node-dev --inspect server.js |
  tee -a log/app.ndjson.log | bunyan -o short
  • 更改代码时node-dev自动重新启动
  • --inspect启用调试器,我可以使用chrome devtools连接到该调试器
  • tee将stdout复制到磁盘,所以如果我将来真的想回去查看日志,我可以,但我不想在我的终端中看到完整的ndjson记录
  • bunyan -o short为我的终端提供了漂亮的打印输出,这正是我想要的本地开发

最新更新