首页 > 解决方案 > Winston 3.x 缺少对 logstash 的支持?

问题描述

我正在尝试将虚拟 nodejs 应用程序集成到 ELK 堆栈中。我使用 winston 作为日志库,因为它是我在 JS 堆栈上开发时的首选。我尝试使用winston 3.x 版本编写这段代码

var winston = require('winston');
require('winston-logstash');


var logger =  winston.createLogger({
    level: 'info',
    transports: [
        new winston.transports.Console(),
        new winston.transports.Logstash({
            port: 5000,
            node_name: 'my node name',
            host: '127.0.0.1'
        })
    ]
});

logger.info('ciao mondo')

结果是

> node index.js

logstash is a legacy winston transport. Consider upgrading: 
- Upgrade docs: https://github.com/winstonjs/winston/blob/master/UPGRADE-3.0.md

所以我已经阅读了官方说明,其中指出 logstash 支持现在是一种格式

var winston = require('winston');
require('winston-logstash');


var logger =  winston.createLogger({
    level: 'info',
    format : winston.format.logstash(),
    transports: [
         new winston.transports.Console()/*,
         new winston.transports.Logstash({
           port: 5000,
           node_name: 'my node name',
           host: '127.0.0.1'
         })*/
      ]
  });

  logger.info('ciao mondo')

现在输出是

> node index.js

{"@message":"ciao mondo","@fields":{"level":"info"}}

没关系,但是由于我没有告诉如何连接 logstash 套接字,所以集中式日志记录系统没有收到此事件。

我已经尝试将 winston 降级到 2.4.1 并且它工作正常,除了我失去了后来版本中引入的一些好的功能这一事实。我没有找到任何关于 3.x 版本的 logstash 支持的文档。我错过了什么还是我必须写一些自定义的东西?

标签: node.jslogginglogstashwinstonelk

解决方案


在 Winston 3 中,这里有两个概念在起作用。

格式只是对您正在记录的对象进行一些转换。

传输是一个“管道”,它定义了一种获取日志对象并将其发送到某处的方式。

在 Winston 2 世界中,这两个概念经常结合在一起;例如,该winston-logstash模块是一种传输方式,但也是以 Logstash 可接受的方式隐式格式化的对象。Winston 2 或 3 中没有限制传输或格式方面的可能性,因此 Winston 3 并不是“缺少对 Logstash 的支持”。

但是,Winston 3确实对传输 API 进行了一些更改(并且还分离了格式,如前所述 - 尽管传输仍然可以进行格式化)。winston-logstash这就是为什么您会看到有关成为传统传输的警告:作者winston-logstash尚未更新他们的模块以使用新的 Winston 3 样式界面。Winston 项目中有一个线程,其中包含一些对传输作者更新其传输的有用信息。

所以,你可以让作者升级他们的传输,自己升级/包装它(参见链接的线程),或者 - 我认为legacy警告只是一个警告,所以它应该仍然适用于 Winston 3。

事实上,我认为已经有一个PR开放让winston-logstash3.x 兼容,尽管 repo 维护者似乎已经幻影了;我想你可以尝试使用 PR 分支/叉子。您也可以尝试winston-logstash-transport,它似乎可以实现相同的目标,但似乎是为 3.x 设计的。随意评论什么最有效。


推荐阅读