import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; import { Observable } from 'rxjs'; import { InjectPinoLogger, PinoLogger } from 'nestjs-pino'; import { maskSensitive } from '../common/mask.js'; /** 记录请求 body(POST/PUT/PATCH/DELETE),敏感字段脱敏,级别 debug。 */ @Injectable() export class BodyLoggingInterceptor implements NestInterceptor { constructor(@InjectPinoLogger(BodyLoggingInterceptor.name) private readonly logger: PinoLogger) {} intercept(context: ExecutionContext, next: CallHandler): Observable { const request = context.switchToHttp().getRequest(); const { method, url, body } = request; if (body && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method) && Object.keys(body).length > 0) { this.logger.debug({ method, url, body: maskSensitive(body) }, 'request body'); } return next.handle(); } }