NestJS를 사용한 자바스크립트 앱의 로그 수집 및 분석 방법

로그 수집과 분석은 애플리케이션 개발 및 운영에서 중요한 역할을 합니다. 로그는 애플리케이션의 동작과 문제를 추적하고 파악하는 데에 도움을 주며, 이를 통해 빠른 대응과 구조적인 개선이 가능합니다.

이번 글에서는 NestJS 프레임워크를 사용하여 자바스크립트 앱의 로그 수집 및 분석을 어떻게 구현할 수 있는지 알아보겠습니다.

1. Winston 로그 라이브러리

로그를 수집하고 분석하기 위해서는 먼저 로그를 기록할 수 있는 라이브러리가 필요합니다. NestJS에서 가장 많이 사용되는 로그 라이브러리인 Winston을 선택할 것을 추천합니다. Winston은 다양한 로그 레벨을 지원하고, 여러 출력 방식으로 로그를 기록할 수 있는 유연한 기능을 제공합니다.

Winston을 설치하려면 프로젝트 루트 폴더에서 다음 명령어를 실행하세요:

npm install --save winston

2. 로그 설정 파일 생성하기

로그를 설정하기 위해 NestJS에서는 별도의 설정 파일을 사용합니다. src/config/logging.config.ts 파일을 만들고 다음 코드를 추가해주세요:

import { transports, format } from 'winston';

export const loggingConfig = {
  transports: [
    new transports.Console({
      format: format.combine(
        format.colorize(),
        format.simple(),
      ),
    }),
  ],
};

이 설정은 로그를 콘솔에 출력하는 설정입니다. 여기에서는 간단한 형식으로 로그를 출력하며, 색상 지정 기능도 포함하고 있습니다. 필요에 따라 다른 설정을 추가하여 파일 또는 외부 서비스에 로그를 저장할 수도 있습니다.

3. 로그 모듈 생성하기

로그 모듈은 애플리케이션 전역에서 사용할 수 있는 로그 객체를 제공합니다. src/logging/logging.module.ts 파일을 생성하고 다음 코드를 추가해주세요:

import { Module } from '@nestjs/common';
import { LoggingService } from './logging.service';

@Module({
  providers: [LoggingService],
  exports: [LoggingService],
})
export class LoggingModule {}

LoggingService는 실제로 로그를 기록하는 역할을 수행합니다. src/logging/logging.service.ts 파일을 생성하고 다음 코드를 추가해주세요:

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

@Injectable()
export class LoggingService {
  constructor(@Inject('winston') private readonly logger: Logger) {}

  info(message: string): void {
    this.logger.info(message);
  }

  warning(message: string): void {
    this.logger.warn(message);
  }

  error(message: string, stackTrace?: string): void {
    this.logger.error(message, { stackTrace });
  }
}

이제 애플리케이션에서 LoggingService를 사용하여 로그를 기록할 수 있습니다.

4. 로그 모듈 사용하기

애플리케이션의 다른 모듈에서 로그를 사용하려면 LoggingModule을 임포트하고 LoggingService를 주입하면 됩니다. 예를 들어, src/app.module.ts 파일을 열고 다음 코드를 추가해주세요:

import { Module } from '@nestjs/common';
import { LoggingModule } from './logging/logging.module';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [LoggingModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

이제 AppService에서 LoggingService를 주입하여 로그를 기록할 수 있습니다. src/app.service.ts 파일을 열고 다음 코드를 추가해주세요:

import { Injectable } from '@nestjs/common';
import { LoggingService } from './logging/logging.service';

@Injectable()
export class AppService {
  constructor(private readonly loggingService: LoggingService) {}

  doSomething(): void {
    try {
      // 로직 처리
    } catch (error) {
      this.loggingService.error('오류 발생', error.stack);
    }
  }
}

이렇게 NestJS와 Winston을 사용하여 로그를 수집하고 분석하는 방법을 알아보았습니다. 로그는 애플리케이션 개발 및 운영에서 꼭 필요한 요소이므로, 적절하게 활용하는 것이 중요합니다.

더 자세한 정보를 원하면 NestJS 공식 문서를 참조해주세요.

#log #NestJS