温斯顿的日志stream如何工作?

Winston文档有一个关于stream式日志的部分,它说:

stream式传输允许您从您select的传输中将日志stream式传回。

并给出以下代码示例:

// // Start at the end. // winston.stream({ start: -1 }).on('log', function(log) { console.log(log); }); 

我读到这一点是,每个新的日志消息添加将被输出到控制台。 {start: -1}configuration指示stream在文件结尾处开始,因此只有新的日志条目被输出。 我期望下面的Node脚本会导致test.log文件的每一行都输出到控制台,然后每隔500ms输出一个新的对象。

 var winston = require('winston'); winston.add(winston.transports.File, { filename: 'test.log' }); winston.remove(winston.transports.Console); winston.stream().on('log', function(log) { console.log(log); }); setInterval(function(){ winston.log('info', 'help'); }, 500); 

我希望看到像下面的输出:

 {"level":"info","message":"help","timestamp":"2013-12-10T05:55:15.806Z"} {"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.307Z"} {"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.809Z"} {"level":"info","message":"help","timestamp":"2013-12-10T05:55:17.309Z"} {"level":"info","message":"help","timestamp":"2013-12-10T05:56:48.316Z"} 

实际上发生的事情是,日志工作与File传输一样(该文件每500毫秒获取一个新的日志条目),但没有输出到控制台。 console.log(log)行永远不会被调用。

我错过了一些明显的东西,或者误解了Winston的日志stream的目的?

我已经经历了你所描述的同一种bugg。 我的结论是,默认的logging器var winston = require('winston')不能用于函数querystream也不是EventEmitter所以你可以使用winston.on('logging', function() {...})

你需要使用的解决scheme是像这样实例化你自己的logging器:

  var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ level: 'info' }), new (winston.transports.File)({ filename: 'app.log' }) ] }); 

然后你做一些日志logging:

  setInterval(function(){ logger.log('info', 'logging some stuff..'); }, 500); 

那么您可以通过使用stream来传输已经logging的条目:

  logger.stream().on('log', function(log) { console.log('>>> ', log); }); 

我认为你错误的理解了streamfunction,因为它不会stream动日志条目,它只是stream所有你已经logging的条目。 要将事件挂接到logging器,可以使用logging器对象上的“logging”事件:

  logger.on('logging', function (transport, level, msg, meta) { // [msg] and [meta] have now been logged at [level] to [transport] console.log("[%s] and [%s] have now been logged at [%s] to [%s]", msg, JSON.stringify(meta), level, transport.name); }); 

我不知道为什么这不被默认的logging器支持,正如我在这篇文章的开始所说的,当在默认的logging器中使用querystream函数时,我得到了asynchronous库(依赖于winston)的错误。