Winston 3.x 缺少对 logstash 的支持?

Winston 3.x support for logstash missing?

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

编写这段代码
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 的文档。我是不是遗漏了什么或者我必须写一些自定义的东西?

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

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

A transport 是一个 "pipe",它定义了一种获取日志对象并将其发送到某处的方法。

在Winston 2的世界里,这两个概念经常被结合起来;例如,winston-logstash 模块是一种传输方式,但也以 Logstash 可接受的方式隐式格式化对象。 Winston 2 或 3 中没有任何内容限制传输或格式方面的可能性,因此 Winston 3 不是 "missing support" for Logstash。

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

因此,您可以窃听作者升级他们的传输,upgrade/wrap 自己升级(参见链接线程),或者 - 我认为 legacy 警告只是一个警告,所以它仍然应该可以与 Winston 3 一起使用。

事实上,我认为已经有一个 PR open to make winston-logstash 3.x compatible, though the repo maintainer seems to have ghosted; I suppose you could try using the PR branch/fork. You might also try winston-logstash-transport 似乎实现了相同的目标,但似乎是为 3.x 设计的。请随意评论什么最有效。

您可以按照本指南 here 了解如何将 winston 与 winston-elasticsearch 插件一起使用。这会生成 logstash 格式的日志,因此可由 Kibana 使用。

winston-elasticsearch 信息

特点

  1. logstash 兼容消息结构。
  2. 因此可与 kibana 一起使用。
  3. 基于日期模式的索引名称。
  4. 自定义转换器函数 将记录的数据转换为不同的消息结构。
  5. 缓冲 在 ES 不可用的情况下的消息。极限是内存 因为所有未写的消息都保存在内存中。

兼容性

对于 Winston 3.x,Elasticsearch 6.0 and later,使用 0.7.0。对于 Elasticsearch 6.0 and later,使用 0.6.0。对于 Elasticsearch 5.0 及更高版本,请使用 0.5.9。对于早期版本,请使用 0.4.x series.