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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:35:42