node.js - 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 支持的文档。我错过了什么还是我必须写一些自定义的东西?
解决方案
在 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-logstash
3.x 兼容,尽管 repo 维护者似乎已经幻影了;我想你可以尝试使用 PR 分支/叉子。您也可以尝试winston-logstash-transport,它似乎可以实现相同的目标,但似乎是为 3.x 设计的。随意评论什么最有效。
推荐阅读
- r - 如何将 Global Environment 的所有数据框与 R 中的字符合并?
- python - 为什么 AlexNet 在卷积层使用 96、256 和 384 个过滤器?
- database - 如何解析 ndjson 文件?
- javascript - 如何在不使用 xpath 的情况下使用文档查询选择器获取文本?
- rich-text-editor - 有没有办法在 Rails 6 中禁用动作文本的图像/附件部分?
- sql - SQL在null时消除行
- rust - 为什么这个 Rust 代码需要生命周期参数
- javascript - 正则表达式匹配行尾,除非它以右括号结尾
- java - 每 X 秒运行一次 java 代码,但如果代码有效,请不要等待 TimeUnit.sleep
- postgresql - 根据两列的长列表选择行