如何使HTTP请求对象对我的winston记录器可见



我正在构建一个基于NestJS的应用程序,并使用nest-winston进行日志记录。

我想记录每个日志消息的传入请求标头。为此,我需要以某种方式从nestjs中提取HTTP上下文,并将其传递给nest-winston

我也不知道该怎么做。如果这在nest-winston中不可行,我不介意直接使用winston

据我所知,这在nest-winston模块中是不可行的,因为它的记录器不在REQUEST范围内。您需要创建自己的动态模块,并将您的服务作为REQUEST的作用域。然后,您可以使用@Inject(REQUEST)将请求添加到您要创建的winston服务的每个实例中。

话虽如此,请求作用域类也有一些缺点,即资源消耗,因为不仅必须重新实例化服务,而且必须重新实例化依赖于该winston服务的每个服务,然后再实例化每一个服务,直到到达控制器。需要牢记

我认为您可以使用中间件来解决这个特定的问题。检查https://docs.nestjs.com/middleware

中间件可能是这样的(没有测试(:

import { NextFunction, Request, Response } from 'express';
import {Inject, Injectable,NestMiddleware} from '@nestjs/common';
import * as http from 'http';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) {
}
public use(request: Request, response: Response, next: NextFunction): void {
const {body, method, originalUrl, headers} = request;
this.logger.log({body, method, originalUrl, headers})
}
}

你可以这样应用它:

export class AppModule implements NestModule {
public configure(consumer: MiddlewareConsumer): void {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
}

最新更新