如何让Bunyan CLI工具输出的日志文件与控制台格式一致(非JSON)
让Bunyan日志文件与控制台格式一致的解决方法
我来帮你搞定这个问题!目前你遇到的情况是,node . | bunyan会把服务器输出的JSON日志格式化成易读的文本显示在控制台,但如果直接把服务器输出重定向到文件,得到的还是原始JSON。要让server.log和控制台格式一致,有两种常用方法:
方法一:命令行快速实现(无需修改代码)
利用tee命令将Bunyan格式化后的输出同时发送到控制台和文件,这样两者的格式就完全一致了。如果需要文件里不含控制台的颜色控制代码,可以加上--no-color参数:
# 带颜色输出(控制台有颜色,文件也会包含颜色代码) node . | bunyan | tee server.log # 无颜色输出(文件内容更干净,适合后续分析) node . | bunyan --no-color | tee server.log
原理说明:
原来的node .输出的是原始JSON日志,bunyan工具会把这些JSON解析并格式化成你看到的[2018-05-14T12:28:01.465Z] INFO: sampleApplication/12840: hi格式,tee命令会把这个格式化后的内容同时输出到控制台和写入server.log文件。
方法二:代码中配置Logger(长期维护更灵活)
如果希望在代码层面直接控制日志输出格式,不需要每次用命令行处理,可以修改Bunyan的Logger配置,添加两个格式化后的输出流:一个指向控制台,一个指向文件。
首先需要安装bunyan-prettystream(一个常用的Bunyan格式化流工具):
npm install bunyan-prettystream --save
然后修改你的日志初始化代码:
const bunyan = require('bunyan'); const PrettyStream = require('bunyan-prettystream'); const fs = require('fs'); // 配置控制台格式化流 const consoleStream = new PrettyStream(); consoleStream.pipe(process.stdout); // 配置文件格式化流 const fileStream = new PrettyStream(); const logFile = fs.createWriteStream('server.log', { flags: 'a' }); // 'a'表示追加写入 fileStream.pipe(logFile); // 创建Logger实例 const logger = bunyan.createLogger({ name: 'sampleApplication', streams: [ { level: 'info', // 日志级别 stream: consoleStream }, { level: 'info', stream: fileStream } ] }); // 测试日志输出 logger.info('hi');
这样启动服务器时直接运行node .,控制台和server.log就都会输出格式化后的文本日志了。
内容的提问来源于stack exchange,提问作者Rishi Mahendru
相关产品推荐
相关产品推荐

