node.js - Winston 的日志流是如何工作的?

标签 node.js logging stream winston

Winston文档中有一节关于 streaming logs其中说:

Streaming allows you to stream your logs back from your chosen transport.

并给出如下代码示例:

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

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

我是不是漏掉了一些明显的东西,或者误解了 Winston 日志流的用途?

最佳答案

我遇到过与您描述的相同类型的错误。我的结论是默认记录器 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 函数,因为它不会即时流式传输日志条目,它只是流式传输您已经记录的所有条目。 要将事件连接到您的记录器,您可以在记录器对象上使用“记录”事件:

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

我不知道为什么默认记录器不支持它,正如我在本文开头所说的那样,我在使用 query 时在异步库(对 winston 的依赖)中出错> 或使用默认记录器的 stream 函数。

关于node.js - Winston 的日志流是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487480/

相关文章:

c# - ASP.NET MVC 的 FileStreamResult 是否比直接写入响应输出流效率低,还是我遗漏了什么?

node.js - 我们如何将消息从特定事件中心分区获取到 azure 函数中,以及如何自动扩展 azure 函数的数量?

node.js - Mongoose 通过引用数组填充和搜索

logging - 使用 Log4J2 时,我应该编码为 SLF4J 还是 Log4J2 API?

windows - vagrant 在哪里存储日志?

java - 与流被关闭相关的奇怪错误

node.js - 用于 Node 项目的 docker-compose 在 Windows 上找不到 package.json

javascript - 如何修复 Puppeteer 抛出的 "Node is either not visible or not an HTMLElement"错误?

android - 无法获取 GED Log Buf,err(0)

python - Azure Speech SDK 使用 python 从流中将语音转换为文本