Nest.JS LoggerService 接口使用 Winston 记录器的实现需要在消费者类中实例化实现

use*_*702 5 logging node.js winston

我使用 Nest.js 并实现 LoggerService 来自定义记录器。在实现中,它使用 Winston 记录器并且工作正常。


import { LoggerService } from '@nestjs/common';
import * as winston from 'winston';
import { config } from '../config';
import * as path from 'path';
export class AppLogger implements LoggerService {
  private logger: winston.Logger;
  constructor(label?: string) {
    this.initializeLogger(label);
  }
  initializeLogger(label?: string) {
    this.logger = winston.createLogger({
      level: config.logger.level,
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ dirname: path.join(__dirname, './../log/debug/'), filename: 'debug.log', level: 'debug' }),
        new winston.transports.File({ dirname: path.join(__dirname, './../log/error/'), filename: 'error.log', level: 'error' }),
        new winston.transports.File({ dirname: path.join(__dirname, './../log/info/'), filename: 'info.log', level: 'info' })
      ],
    });
    if (process.env.NODE_ENV !== 'production') {
      this.logger.add(
        new winston.transports.Console({
          format: winston.format.simple(),
        }),
      );
    }
  }
  error(message: string, trace: string) {
    this.logger.log("error", "MyLogger error - " + message);
    this.logger.error(message, trace);
  }

  warn(message: string) {
    this.logger.log("warn", "MyLogger error - " + message);
    //this.logger.warn('warn', message);
  }

  log(message: string) {
    this.logger.log("info", "MyLogger error - " + message);
    // this.logger.log('info', message);
  }

Run Code Online (Sandbox Code Playgroud)

每个控制器,我都必须导入已实现的记录器并在类级别实例化相同的记录器以调用相应的日志方法,如下所示。

import { Controller, Get } from '@nestjs/common';
import { config } from './../../config';
import { AppLogger } from '../app.logger'
@Controller()
export class HealthcheckController {
  private start: number;
  private logger: AppLogger = new AppLogger();
  constructor() {
    this.start = Date.now();
  }

  @Get('healthcheck')
  async get() {
    const now = Date.now();

    this.logger.error("This is from Healthcheck log","");
    return {
      status: 'pass',
      version: config.version,
      details: {
        uptime: `${Number((now - this.start) / 1000).toFixed(0)}`,
      },
    };
  }
}


Run Code Online (Sandbox Code Playgroud)

在 Main.ts 中

 this.app = await NestFactory.create<NestFastifyApplication>(
      AppModule,
      new FastifyAdapter({ logger: new AppLogger('Nest') }),
    );

Run Code Online (Sandbox Code Playgroud)

请告知如何避免在所有控制器上实例化记录器。

最好的方法是什么。

  private logger: AppLogger = new AppLogger();

Run Code Online (Sandbox Code Playgroud)

Fad*_*del 2

使用依赖注入通过构造函数将服务注入到控制器中。

export class HealthcheckController {
...
public constructor(private readonly appLogger: AppLogger) {}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在您的服务中使用 @Injectable() 装饰器

@Injectable()
export class AppLogger implements LoggerService {
Run Code Online (Sandbox Code Playgroud)

依赖注入基础知识

  • 这并不完全是链接,但仍然可以使用一些解释。 (3认同)