@nestjs/common 패키지에서 Logger 클래스를 불러온 후 인스턴스를 생성한 다음에 log()나 warn(), debug()와 같은 메서드를 호출하면 된다.Logger() 생성자의 인자로 <클래스명>.name을 넘기주면 로거의 컨텍스트(context)가 클래스 이름으로 설정된다.import { Injectable, Logger } from "@nestjs/common";
@Injectable()
export class AppService {
private readonly logger = new Logger(AppService.name);
getHello(): string {
this.logger.debug("Logging...");
return "Hello World!";
}
}
@nestjs/common 패키지의 ConsoleLogger 클래스를 확장(extend)하여 원하는 메서드만 오버라이드(override)해주면 된다.debug 수준과 warn 수준에서 로그가 찍힐 때 메시지 앞에 특정 이모지(emoji)를 함께 출력되도록 로거를 확장해보자.import { ConsoleLogger, Injectable } from "@nestjs/common";
@Injectable()
export class MyLogger extends ConsoleLogger {
debug(message: any, ...optionalParams: any[]) {
super.debug(`🐛 ${message}`, ...optionalParams);
}
warn(message: any, ...optionalParams: any[]) {
super.warn(`🚨 ${message}`, ...optionalParams);
}
}
NestFactory.create()를 호출할 때 logger 옵션으로 확장한 로거 클래스의 인스턴스를 넘겨주면 된다.main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { MyLogger } from "./my-logger";
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: new MyLogger(),
});
await app.listen(3000);
}
bootstrap();
@nestjs/common 패키지의 LoggerService 인터페이스를 구현(implement)하는 경우가 있다.log, warn, error는 반드시 구현해줘야 하고, debug, verbose는 선택적으로 구현이 가능하다.import { LoggerService, Injectable } from '@nestjs/common';
@Injectable()
export class MyLogger implements LoggerService {
/**
* 'log' 레벨 로그 작성.
*/
log(message: any, ...optionalParams: any[]) {}
/**
* 'fatal' 레벨 로그 작성.
*/
fatal(message: any, ...optionalParams: any[]) {}
/**
* 'error' 레벨 로그 작성.
*/
error(message: any, ...optionalParams: any[]) {}
/**
* 'warn' 레벨 로그 작성.
*/
warn(message: any, ...optionalParams: any[]) {}
/**
* 'debug' 레벨 로그 작성.
*/
debug?(message: any, ...optionalParams: any[]) {}
/**
* 'verbose' 레벨 로그 작성.
*/
verbose?(message: any, ...optionalParams: any[]) {}
}
console 전역 객체를 사용하여 로거를 구현해보자.src/logger/logger.service.ts
import { Injectable, LoggerService as NestLoggerService } from "@nestjs/common";
@Injectable()
export class LoggerService implements NestLoggerService {
debug(message: any, ...optionalParams: any[]) {
console.debug(`🐛 ${message}`, ...optionalParams);
}
warn(message: any, ...optionalParams: any[]) {
console.warn(`🚨 ${message}`, ...optionalParams);
}
log(message: any, ...optionalParams: any[]) {
console.log(`🪵 ${message}`, ...optionalParams);
}
error(message: any, ...optionalParams: any[]) {
console.error(`💥 ${message}`, ...optionalParams);
}
}
src/logger/logger.module.ts
import { Module } from "@nestjs/common";
import { LoggerService } from "./logger.service";
@Module({
providers: [LoggerService],
exports: [LoggerService],
})
export class LoggerModule {}
src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerModule } from './logger/logger.module';
@Module({
controllers: [AppController],
providers: [AppService],
imports: [LoggerModule],
})
export class AppModule {}
NestFactory.create() 함수를 호출할 때 bufferLogs 옵션을 반드시 true로 설정해주어야 한다.main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { LoggerService } from "./logger/logger.service";
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
bufferLogs: true,
});
app.useLogger(app.get(LoggerService));
await app.listen(3000);
}
bootstrap();
References
Documentation | NestJS - A progressive Node.js framework
NestJS에서 로깅(logging)하기