如何使用nestjs记录服务

mak*_*_at 21 javascript logging node.js typescript nestjs

我试图使用Loggernestjs 的内部(在https://docs.nestjs.com/techniques/logger - >上描述,但没有描述如何使用它)

但我有问题(试图注射LoggerService等)

任何人都可以解释如何做到这一点?

TIA

Kim*_*ern 58

最佳做法

Logger静态访问更好的是为您的类创建一个实例:

@Controller()
export class AppController {
  private readonly logger = new Logger(AppController.name);

  @Get()
  async get() {
    this.logger.log('Getting stuff');
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么这样更好?

1)您可以在构造函数中提供上下文,new Logger(AppController.name)以便类名(或其他任何内容)将成为此类中所有日志消息的一部分.

2)如果您在某些时候想要扩展或替换默认值LoggerService,除了设置新的记录器之外,您不需要更改任何应用程序代码.您的新记录器将自动使用.如果您静态访问它,它将继续采用默认实现.

const app = await NestFactory.create(AppModule, {logger: new MyLogger()});
Run Code Online (Sandbox Code Playgroud)

  • @KimKern 在代码中包含 `new Logger` 会使代码不可测试,对吗? (3认同)
  • @RezaRahmati 在这种情况下不会,因为您可以使用“module.useLogger(new NoOpLogger());”的模拟或测试实现来覆盖 Logger。 (3认同)
  • 在测试中嘲笑记录器将我带到了这里。很好的做法。 (3认同)
  • “new Logger”如何选择新的记录器实现?这不是显式调用的默认实现吗?这个“Logger”gte 是否从应用程序的底层注入了记录器? (2认同)
  • @Gherman 由 `new Logger` 创建的实例将 Logger 实例作为成员变量。所有方法内部都会调用`instance`的方法。当您覆盖“Logger”时,它只会设置“instance”字段。查看源代码:https://github.com/nestjs/nest/blob/master/packages/common/services/logger.service.ts (2认同)
  • @KimKern 我明白了。我不希望 Logger 成为 Singleton,但事实确实如此。我想知道为什么他们不把它变成可注射的服务。那会更平常。 (2认同)

小智 9

您需要首先导入您的班级:

import { Logger } from '@nestjs/common';
Run Code Online (Sandbox Code Playgroud)

然后您可以开始记录:

Logger.log('info')
Logger.warn('warning')
Logger.error('something went wrong! ', error)
Run Code Online (Sandbox Code Playgroud)

  • 可以,但是Kim的答案更好,因为您在输出中也有该类的名称 (2认同)
  • 我尝试过这个,如果在没有“new”的情况下使用,它不会调用自定义实现。 (2认同)

Adr*_*n H 8

最佳实践是注入现有的记录器。

app.module.ts

import { Logger, Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService, Logger],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

并在app.service.ts中

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

@Injectable()
export class AppService {
  constructor(private readonly logger: Logger) {}

  sayHello() {
    this.logger.log('Hello world!') 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您能解释一下为什么这是“更好的最佳实践”吗?NestJS 文档中的示例不会注入现有的记录器。https://docs.nestjs.com/techniques/logger#using-the-logger-for-application-logging (3认同)
  • 我无法解释为什么@Adrian 更喜欢它,但我喜欢使用注入来传递全局对象,因为它允许您更改记录器类型而不更改本地定义。 (2认同)

mak*_*_at 2

答案很简单。Logger 类有静态方法。

例如

static log(message: string, context = '', isTimeDiffEnabled = true) 
Run Code Online (Sandbox Code Playgroud)

用法:

Logger.log('Only a test');
Run Code Online (Sandbox Code Playgroud)