如何结合Pino的ECS格式化器与TCP传输器处理日志?
解决Pino结合ECS格式化与TCP传输的问题
问题描述
我希望通过Pino处理日志,先使用ECS格式化器对日志进行格式化,再将其发送至TCP传输器,但不知道如何将这两个功能结合。在ECS格式化器文档中,显示初始化Pino时需将格式化器作为第一个参数传入:
const log = pino(ecsFormat())
而TCP传输器文档中则显示初始化Pino时需将传输器作为第一个参数传入:
const log = pino(transport)
这两个功能并非互斥,请问该如何先格式化日志再进行传输?
解决方案
你可以将ECS格式化配置与TCP传输器配置合并到同一个Pino配置对象中,具体步骤如下:
- 安装所需依赖:
npm install pino @elastic/ecs-pino-format pino-socket
- 编写代码结合两者功能:
const pino = require('pino') const ecsFormat = require('@elastic/ecs-pino-format') // 配置TCP传输器 const tcpTransport = pino.transport({ target: 'pino-socket', options: { address: '你的TCP服务器地址', // 替换为实际地址 port: 9999 // 替换为实际端口 } }) // 合并ECS格式化配置与传输器配置 const log = pino({ ...ecsFormat(), // 展开ECS格式化的所有配置规则 transport: tcpTransport // 指定日志传输器 }) // 测试输出 log.info('这是一条经过ECS格式化并通过TCP发送的日志')
原理说明
ecsFormat() 返回的是包含Pino格式化规则的配置对象,通过对象展开运算符(...)将其合并到Pino的主配置中,同时添加transport属性指定TCP传输器。这样Pino会先按照ECS标准格式化日志内容,再将格式化后的日志通过TCP传输器发送到目标地址。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

