NestJS - 在瞬态记录器中请求范围服务

时间:2021-01-22 08:12:47

标签: nestjs

我目前正在尝试使用唯一的请求 ID 扩展我的 NestJS (v7) 应用程序中的日志记录类。当我尝试在我的临时记录器中插入我的请求范围服务时,如果我将它注入某处,记录器总是 undefined

winston-logger.class.ts

import { Injectable, Scope } from '@nestjs/common';
import { Logger } from 'winston';
import { RequestInjector } from './request-injector.class';
import { WinstonAdapter } from './winston.adapter';

@Injectable({ scope: Scope.TRANSIENT })
export class WinstonLogger {
    private readonly logger: Logger;
    private requestId = 'default';
    private context = 'default';

    constructor(private readonly winstonAdapter: WinstonAdapter, private readonly requestInjector: RequestInjector) {
        this.logger = this.winstonAdapter.getLogger();
        this.requestId = this.requestInjector.getRequestId();
    }

    log(level: string, message: string, ...meta: any[]): void {
        meta.push({ requestId: this.requestId });
        this.logger.log(level, message, ...meta);
    }
    setContext(context: string) {
       this.context = context;
    }
}

request-injector.class.ts

import { Injectable, Scope } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST })
export class RequestInjector {
    private requestId = 'default';

    constructor() {}

    setRequestId(requestId: string) {
        this.requestId = requestId;
    }

    getRequestId(){
        return this.requestId;
    }
}

如果我将 RequestInjector 更改为 DEFAULT (Singleton) 或 TRANSIENT 记录器已定义但如果我将其更改为 REQUEST 记录器是 {{1}如果我在某处注入它。我是不是遗漏了什么,为什么这不起作用?

我无法更改记录器的范围,因为记录器中的上下文是 undefined

我想要实现的是,每个注入我的记录器的类都有自己的上下文,但对于请求应该具有相同的 requestId。

0 个答案:

没有答案