You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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中配置索引模式

  1. 打开Kibana后台,进入Management > Index Patterns
  2. 创建新索引模式,匹配nestjs-logs-*(与Logstash配置中的索引前缀对应)
  3. 设置时间字段为@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:40:15