Winston的日志流如何工作?

drz*_*zax 8 logging stream node.js winston

该温斯顿文档有一个部分流日志它说:

Streaming允许您从所选的传输中流回日志.

并给出以下代码示例:

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

我对此的解读是,添加的每条新日志消息都将输出到控制台.该{start: -1}配置告诉流在文件末尾开始,所以只有新的日志条目输出.我希望以下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);
Run Code Online (Sandbox Code Playgroud)

我希望看到类似以下输出:

{"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"}
Run Code Online (Sandbox Code Playgroud)

实际发生的是日志记录按文件传输的方式工作(文件每500毫秒获取一个新的日志条目),但控制台没有输出.console.log(log)永远不会调用该行.

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

use*_*089 9

我经历过你所描述的那种bugg.我的结论是默认记录器var winston = require('winston')不能与函数一起使用query,stream也EventEmitter不能使用winston.on('logging', function() {...}).

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

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

然后你做一些日志记录:

  setInterval(function(){
    logger.log('info', 'logging some stuff..');
  }, 500);
Run Code Online (Sandbox Code Playgroud)

然后您可以使用stream以下方法流式传输已记录的条目:

  logger.stream().on('log', function(log) {
    console.log('>>> ', log);
  });
Run Code Online (Sandbox Code Playgroud)

我认为你误解了这个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);
  });
Run Code Online (Sandbox Code Playgroud)

我不知道这是为什么没有被默认的记录支持,并使用时,因为我在这个岗位我得到的异步库(依赖于温斯顿)的内部错误开头所说的query或stream功能与默认记录器.