nestjs에서의 로깅

LEEEEEEE·2023년 12월 10일

etc

목록 보기
1/3

로깅(Logging)이란?

로깅은 애플리케이션의 동작과 상태에 대한 정보를 기록하는 프로세스를 의미합니다. 이는 애플리케이션의 디버깅, 모니터링, 성능 평가, 사용자 트래킹 등에 도움이 됩니다.


NestJS에서의 로깅

NestJS에서는 기본적으로 내장된 로거를 제공합니다. 이 로거를 사용하여 애플리케이션의 실행과정, 에러, 중요 이벤트 등을 기록할 수 있습니다.
예외가 발생한 경우 어떻게 예외 정보를 로깅하는지에 대한 내용도 추가할 수 있습니다.

예시 코드

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

@Controller('reservation')
export class ReservationController {
  private readonly logger = new Logger('ReservationController');
  
  @Get('/allReservation')
  getAllFestival(): Promise<ReservationEntity[]> {
    this.logger.warn('Logging...');  // 여기서 로깅이 이루어짐
    return this.reservationService.getAllReservation();
  }
}
  1. Logger 모듈 생성:
    코드의 ReservationController 클래스 내에서 private readonly logger = new Logger('ReservationController'); 부분에서 Logger 모듈을 생성하고 있습니다.
    생성자에 전달된 문자열은 로깅에 사용될 컨텍스트 이름으로, 여기서는 'ReservationController'로 설정을 했습니다.

  2. 로깅 수준 및 메시지 전달:
    getAllFestival 메소드에서 this.logger.warn('Logging...'); 코드를 통해 로깅이 이루어집니다.
    warn은 로그의 수준 중 하나로, 경고 메시지를 기록할 때 사용됩니다. NestJS의 Logger는 log, warn, error, debug 등 다양한 로그 수준을 지원합니다.
    'Logging...'은 해당 로그 메시지의 내용으로, 실제로는 자신이 원하는 어떤 정보든 포함시킬 수 있습니다.

  3. 로깅 결과:
    실행 중인 NestJS 애플리케이션에서 해당 로깅이 발생하면, 설정된 로그 수준에 따라 로그가 콘솔 또는 다른 출력 대상에 표시됩니다.
    예를 들어, 위 코드에서는 warn 수준이므로 콘솔에는 경고 로그가 출력됩니다.


전역객체를 사용한 로거 구현

현재 로거 구현을 위해 일관성 유지를 위한 로거 서비스 코드와
nestJS의 종속성 주입?에 관해 로거 모듈 코드를 준비했습니다.

LoggerService (로거 서비스) 코드:

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);
  }
}
  1. @Injectable() 데코레이터:
    클래스에 @Injectable() 데코레이터를 사용하여 NestJS에게 해당 클래스가 주입 가능한 서비스임을 알려줍니다.
  2. NestLoggerService 구현:
    NestLoggerService를 구현하여, NestJS의 내장 로깅 시스템을 사용할 때 필요한 메소드들(debug, warn, log, error)을 제공합니다.
  3. 로그 수준 및 메시지 포맷:
    각 로그 메소드는 자체적으로 선택한 이모지와 함께 메시지를 출력합니다.
    debug: 🐛, warn: 🚨, log: 🪵, error: 💥

LoggerModule (로거 모듈) 코드:

import { Module } from '@nestjs/common';
import { LoggerService } from './logger.service';

@Module({
  providers: [LoggerService],
  exports: [LoggerService],
})
export class LoggerModule {}

LoggerService 등록:

app.useLogger(app.get(LoggerService));를 통해 애플리케이션에 사용자 정의 LoggerService를 등록합니다.
이로써 애플리케이션에서 발생하는 로그는 설정된 사용자 정의 로거에 따라 처리됩니다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggerService } from './logger/logger.service';
import * as config from 'config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    bufferLogs: true,
  });

  app.useLogger(app.get(LoggerService));

  const serverConfig: any = config.get('server');
  const port = serverConfig.port;

  await app.listen(port);
}
bootstrap();

bufferLogs - NestJS앱을 생성할 때 사용되는 NestFactory.create 메서드의 옵션 중 하나로 이 옵션은 로그를 버퍼링하도록 설정하는데, 이는 애플리케이션의 로그가 생성되기 전에 버퍼에 저장되어 나중에 모아서 출력되도록 하는 동작을 의미합니다.
즉, 나중에 모아서 한번에 출력되기 때문에 로그의 순서를 보장받을 수 있습니다.


참고자료

profile
한단계씩 성장하고 싶은 개발자

0개의 댓글