夜深写的,有些地方没仔细写,不过还是想跟大家分享一下。
正文
写代码少不了日志框架,这里我谈一下nodejs里我接触过的两个日志框架bunyan和log4js。
log4js
打开log4js的github可以看到star数在600+,作为一个nodejs开源项目已经算不错了。在看一下log4js的特性,coloured console logging、可以设置输出等级,这两个是日志框架必备功能。可以配置输出格式是一个加分项,遗憾的是文档写的太简陋,没有找到具体如何配置。除此之外还算有特点的功能就是可以给不同类别的appender设置不同的输出级别,但是我研究了一下发现这个功能很不实用。具体为什么不实用大家可以自行研究。
log4js有一个问题是没办法将某个日志只输出到特定的文件,不在console里输出,并且不和其他日志混在一起。这也是我后来转用bunyan的一个原因。
bunyan
bunyan是一个很有特点的日志框架,它除了可以让不同类别的日志输出到不同的地方外,还有一个特点就是输出的日志是json格式的,比如:
$ node myapp.js
{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"start","time":"2013-01-04T07:47:25.814Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":30,"msg":"creating a wuzzle","time":"2013-01-04T07:47:25.815Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":40,"msg":"This wuzzle is woosey.","time":"2013-01-04T07:47:25.815Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"done","time":"2013-01-04T07:47:25.816Z","v":0}
开始你会觉得这种格式可读性很差,没关系,通过npm install -g bunyan,你安装了一个bunyan命令,这个命令就是一个读取日志文件的客户端,用这个命令可以将json格式的日志变为可读的,你只需要在启动时加上额外的命令即可:
$ node myapp.js | bunyan -o short
07:46:42.707Z INFO myapp: start
07:46:42.709Z INFO myapp: creating a wuzzle (widget_type=wuzzle)
07:46:42.709Z WARN myapp: This wuzzle is woosey. (widget_type=wuzzle)
07:46:42.709Z INFO myapp: done
怎样,是不是又恢复了清爽。bunyan除了可以format控制台的日志输出,也同样可以查看日志文件,在命令后跟文件名即可。bunyan最实用的功能是过滤功能,譬如bunyan -l error,就只显示ERROR级别的日志,这在排查错误时在成千上万行日志里找信息非常有帮助。而bunyan -c 'this.name == “something”'将只会显示name为something的日志。
bunyan存在的不足是其时间输出默认为UTC而且我没有找到地方可以配置,也没有地方自定义输出pattern。
总结
总的来说两个日志框架都还不错,如果没有复杂需求用log4js完全够了,如果想体验下日志过滤功能并对UTC格式的时间输出没有强迫症的也可以选择bunyan。
最后再提一下winston,这家伙我也考虑了很久,其最大特点是扩展性好,类似于java的log4j,而且文档完善,star在2600+,拥有超高人气。缺点是我觉得其过于复杂,而且输出很难看。