【问题标题】:Winston 3.x support for logstash missing?Winston 3.x 缺少对 logstash 的支持?
【发布时间】:2019-11-10 22:31:04
【问题描述】:

我正在尝试将虚拟 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.js logging logstash winston elk


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢 davewy 的详尽回答!我可以确认 API 更改破坏了与 winston-logstash 的兼容性。我已经过早地丢弃了winston-logstash-transport,因为它似乎没有另一个那么广泛,但实际上,第一个列出的似乎不再维护。我将通过 winston-logstash-transport 报告我的反馈。对于 Winston 社区来说,与 ELK 堆栈轻松集成很重要!
    • 你能成功使用winston-logstash-transport吗?集成winston-logstash-transport而不是winston-logstash后,我的日志没有传输到logstash实例
    【解决方案2】:

    您可以按照本指南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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2019-08-15
      相关资源
      最近更新 更多