如何使用nestjs-pino将NestJS应用日志发送至Logstash?
将NestJS的pino日志发送至ELK栈(Logstash+Elasticsearch+Kibana)
问题背景
我在NestJS的AppModule中配置了如下nestjs-pino日志:
LoggerModule.forRoot({ pinoHttp: { base: undefined, autoLogging: false, genReqId: () => uuidv4(), messageKey: 'message', level: 'info', formatters: { level: (label: string) => ({ level: label.toUpperCase() }) }, customProps: (req: IncomingMessage) => { return { request_uuid: req.id, request_method: req.method, request_uri: req.url }; }, serializers: { req: () => { return undefined; }, res: () => { return undefined; } } }, renameContext: 'logger_name' }),
希望将这些日志发送至Logstash,最终存入Elasticsearch并通过Kibana查询。已用Docker部署ELK栈,尝试过pino-socket,请问如何实现日志发送?
实现步骤
1. 安装依赖
安装pino-socket,它支持将pino日志通过TCP/UDP协议发送到Logstash:
npm install pino-socket --save
2. 修改NestJS Logger配置
在现有LoggerModule.forRoot的pinoHttp配置中添加transport字段,指定Logstash的连接信息:
import { LoggerModule } from 'nestjs-pino'; import { v4 as uuidv4 } from 'uuid'; import { IncomingMessage } from 'http'; LoggerModule.forRoot({ pinoHttp: { base: undefined, autoLogging: false, genReqId: () => uuidv4(), messageKey: 'message', level: 'info', formatters: { level: (label: string) => ({ level: label.toUpperCase() }) }, customProps: (req: IncomingMessage) => { return { request_uuid: req.id, request_method: req.method, request_uri: req.url }; }, serializers: { req: () => undefined, res: () => undefined }, // 添加pino-socket传输配置 transport: { target: 'pino-socket', options: { address: 'logstash', // Docker同网络下直接用Logstash容器名;否则用宿主机IP port: 5000, // Logstash监听的TCP端口 mode: 'tcp' // 可选tcp/udp,默认TCP } } }, renameContext: 'logger_name' }),
注意:如果NestJS容器和ELK栈在同一个Docker网络,直接用Logstash容器名称作为
address即可;不在同一网络的话,需填写宿主机IP,并确保Logstash的5000端口已映射到宿主机。
3. 配置Logstash接收日志
创建Logstash配置文件(如logstash.conf),配置TCP输入、JSON解码逻辑,再将日志输出到Elasticsearch:
input { tcp { port => 5000 codec => json_lines # 匹配pino-socket每行一个JSON的输出格式 } } filter { # 可选:添加自定义索引前缀,按日期拆分索引 mutate { add_field => { "[@metadata][index]" => "nestjs-logs-%{+YYYY.MM.dd}" } } } output { elasticsearch { hosts => ["elasticsearch:9200"] # Docker同网络下用Elasticsearch容器名 index => "%{[@metadata][index]}" } }
将该配置文件挂载到Logstash容器的配置目录(通过Docker Compose的volumes字段),重启Logstash服务。
4. 在Kibana中配置索引模式
- 打开Kibana后台,进入Management > Index Patterns
- 创建新索引模式,匹配
nestjs-logs-*(与Logstash配置中的索引前缀对应) - 设置时间字段为
@timestamp(pino默认会自动添加该字段)
5. 验证日志流转
启动NestJS应用,发起请求生成日志,然后在Kibana的Discover页面选择对应的索引模式,即可查询到已同步的日志数据。
备选方案:使用pino-logstash
如果pino-socket不符合需求,可尝试专门适配Logstash的pino-logstash:
npm install pino-logstash --save
修改transport配置:
transport: { target: 'pino-logstash', options: { host: 'logstash', port: 5000, mode: 'tcp' } }
内容的提问来源于stack exchange,提问作者Sardor Taylakov
相关产品推荐
相关产品推荐

