日志对于问题定位、调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下。
好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统。我们从下面几个方面来做选型:
1. 每行日志都须要有准确无误的时间戳
2. 日志格式easy被人理解同一时候也easy被计算机进行分析处理
3. 同意配置不同的日志输出,比方对于不同级别的日志配置不同的处理方式
基于上述的要求,有两款Node.js框架脱颖而出,各自是Bunyan和Winston。
- Bunyan by Trent Mick.
- Winston(Flatiron 框架的一部分),由nodejitstu赞助.
Winston
Winston是Node.js最流行的日志框架之中的一个,设计为一个简单通用的日志库,支持多传输(在Winston中,一个传输实质上代表储存设备,也就是数据终于保存在哪里),每一个Winston实例都能够对不同级别的日志配置不同的传输。
安装(Installation)
npm install winston使用(Usage)
最主要的方式是使用Winston模块输出的默认日志对象实例。var winston = require('winston'); winston.log('info', 'Hello distributed log files!'); winston.info('Hello again distributed logs');上述代码和下述代码效果一样
var winston = require('winston'); var logger = new winston.Logger(); logger.log('info', 'Hello distributed log files!'); logger.info('Hello again distributed logs');两段代码都会产生下面输出:
info: Hello distributed log files!
info: Hello again distributed logs
格式化(Formatting)
默认格式化器缺少细节信息,没有时间戳、机器名和进程号,输出格式也不那么适合机器处理。你能够得到全部信息,仅仅是得自己略微多做点工作。winston.info('Hello world!', {timestamp: Date.now(), pid: process.pid});输出例如以下,信息更丰富,但依旧不那么适合机器处理。
info: Hello world! timestamp=1402286804314, pid=80481
最后,log方法提供了和util.format一样的字符串添补方法,比方:
winston.log('info', 'test message %d', 123);
传输(Transporters)
Winston能够通过构造函数的參数进行配置,或者通过暴露的接口方法,在GitHub上都有详尽的描写叙述。配置主要是和传输有关,默认情况下,传输使用console和文件,只是在npmjs.org站点上能够看到有各种各样的由社区贡献的模块,从MongoDB到其它第三方商用平台。
当中一个比較值得一提的是winston-irc,你能够用来把日志输出到你的团队的IRC渠道,这看来很方便。
winston.add(require('winston-irc'), { host: 'irc.somewhere.net', nick: 'logger', pass: 'hunter2', channels: { '#logs': true, 'sysadmin': ['warn', 'error'] } });
多个日志实例(Multiple Loggers)
当应用规模增长时,可能须要针对不同的功能领域配置不同的日志,这能够通过winston.loggers(实际上是winston.Container的实例)来实现winston.loggers.add('category1', {console: { ... }, file: { ... }}); winston.loggers.add('category2', {irc: { ... }, file: { ... }});这样你就能够在应用的不论什么地方訪问上述的预设置好的日志实例:
var category1 = winston.loggers.get('category1'); category1.info('logging from your IoC container-based logger');