Node.js日志框架选型比较:Winston

日志对于问题定位、调试,系统性能调优至关重要,尤其是系统复杂以及在线运行的情况下。

好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统。我们从以下几个方面来做选型:

1. 每行日志都需要有准确无误的时间戳

2. 日志格式容易被人理解同时也容易被计算机进行分析处理

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');

后一篇 Node.js日志框架选型比较:Bunyan

你可能感兴趣的:(Web,Javascript)