如何在NestJS中间件中启用NestJS-Pino的pino-http日志格式
解决方案
1. 替换中间件的Logger为nestjs-pino实例
你当前的LoggerMiddleware用的是Nest原生Logger,而非nestjs-pino集成的日志实例,这是日志缺少req字段的核心原因。修改中间件代码:
import { Injectable, NestMiddleware } from '@nestjs/common'; import { PinoLogger } from 'nestjs-pino'; import { Request, Response, NextFunction } from 'express'; import { randomUUID } from 'crypto'; // 用于生成请求ID @Injectable() export class LoggerMiddleware implements NestMiddleware { constructor(private readonly logger: PinoLogger) { this.logger.setContext(LoggerMiddleware.name); } use(req: Request, res: Response, next: NextFunction) { // 给请求添加唯一ID,对应日志里的req.id req.id = randomUUID(); // 记录日志时传入req对象,pino会自动序列化并添加req相关字段 this.logger.log({ req }, 'Request...'); next(); } }
2. 调整AppModule的日志配置
保留autoLogging: false(因为你用自定义中间件处理日志),补充pino-http的序列化规则,确保req字段格式符合预期:
import { Module } from '@nestjs/common'; import { LoggerModule } from 'nestjs-pino'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { LoggerMiddleware } from './logger.middleware'; @Module({ imports: [ LoggerModule.forRoot({ pinoHttp: { autoLogging: false, serializers: { // 自定义req字段的序列化内容,匹配你期望的格式 req: (req) => ({ id: req.id, method: req.method, url: req.url, query: req.query, params: req.params, headers: req.headers, remoteAddress: req.ip, remotePort: req.socket.remotePort, }), }, }, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(LoggerMiddleware).forRoutes('*'); } }
3. 确保控制器日志一致性
控制器里也要用nestjs-pino的PinoLogger,而非原生Logger,保证格式统一:
import { Controller, Get } from '@nestjs/common'; import { PinoLogger } from 'nestjs-pino'; import { AppService } from './app.service'; @Controller() export class AppController { constructor( private readonly appService: AppService, private readonly logger: PinoLogger, ) { this.logger.setContext(AppController.name); } @Get() getHello(): string { this.logger.log('Controller request handled'); return this.appService.getHello(); } }
关键说明
- 必须使用
nestjs-pino提供的PinoLogger,才能继承其pino-http的格式配置; - 日志时传入
{ req }对象,pino会自动按照配置序列化并添加到日志中; - 如果不需要自定义中间件逻辑,可以直接开启
autoLogging: true,pino-http会自动记录请求的出入日志,无需手动编写中间件。
内容的提问来源于stack exchange,提问作者IdanB
相关产品推荐
相关产品推荐

