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



Winston文档中有一节关于流日志,其中写道:

流式处理允许您将日志从所选日志流式处理返回运输

并给出以下代码示例:

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

我对此的理解是,添加的每个新日志消息都将输出到控制台。{start: -1}配置告诉流从文件结尾开始,因此只输出新的日志条目。我预计下面的Node脚本将导致test.log文件的每一行都被输出到控制台,然后每500毫秒输出一个新对象。

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"}

实际发生的情况是,日志记录与文件传输的预期一样工作(文件每500ms获得一个新的日志条目),但没有输出到控制台。从未调用console.log(log)行。

我是不是错过了什么显而易见的东西,或者误解了温斯顿日志流的目的?

我遇到了与您描述的相同类型的错误。我的结论是,默认记录器var winston = require('winston')不能与函数querystream一起工作,也不是EventEmitter,因此您可以使用winston.on('logging', function() {...})

您需要使用的解决方案是实例化您自己的记录器,如下所示:

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

然后你做一些日志记录:

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

然后可以使用stream:流式传输已经记录的条目

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

我认为您误解了stream函数,因为它不会动态流式传输日志条目,它只是流式传输您已经记录的所有条目。要将事件连接到记录器,您可以在记录器对象上使用"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);
  });

我不知道为什么默认记录器不支持这一点,正如我在本文开头所说,当使用默认记录器的querystream函数时,我会在异步库内部出现错误(依赖于winston)。

相关内容

  • 没有找到相关文章

最新更新