nestjs日志系统,自动输出请求接口记录

881 阅读1分钟
对请求接口数据进行日志文件输出,需要用到请求拦截器interceptor

自己生成拦截器文件,在tap函数里主动触发Logger进行打印输出,参考这里

// 这里定义接口请求日志拦截器
/*
https://docs.nestjs.com/interceptors#interceptors
*/
import { Injectable,  NestInterceptor,  ExecutionContext, CallHandler, Logger } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';


@Injectable()
export class RequestInterceptor implements NestInterceptor {
    intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        const start = Date.now(); // 请求开始时间
        const host = context.switchToHttp();
        const request = host.getRequest<Request>();  //  这里可以得到请求的绝大部分信息
        const reqHeaders: any= request.headers  //得到请求头信息
        // const origin= reqHeaders.host
        // const reqHeaders = request.rawHeaders
        const urlInfo = `${request.method} ${request.url}`;
        return next
            .handle()
            .pipe(
                tap(() =>  
                    Logger.log(`请求接口: ${urlInfo}, 响应时间: ${Date.now() - start} ms  请求来源: ${reqHeaders.host}`),
                ),
            );
    }
}

在main.ts里挂载

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER))  //  全局替换日志系统
  app.useGlobalInterceptors(new RequestInterceptor())  //  对全局的接口 请求 进行日志记录
  await app.listen(3000);
}

image.png