자바스크립트 기반 NestJS 애플리케이션의 실시간 로깅과 모니터링 방법

NestJS는 자바스크립트 및 TypeScript로 개발할 수 있는 프레임워크로, 서버 사이드 애플리케이션 개발에 많은 인기를 끌고 있습니다. NestJS를 사용하여 개발한 애플리케이션에서 실시간 로깅과 모니터링을 구현하는 방법에 대해 알아보겠습니다.

로깅

로그는 애플리케이션의 동작 상황을 기록하는 중요한 요소입니다. NestJS는 여러 로깅 라이브러리를 지원하며, 가장 일반적으로 사용되는 라이브러리는 Winston입니다.

먼저, NestJS 프로젝트에서 Winston을 설치합니다:

$ npm install winston

그런 다음, 로깅 설정을 위한 logger.service.ts 파일을 생성하고 다음과 같이 작성합니다:

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

@Injectable()
export class LoggerService extends Logger {
  private logger: winston.Logger;

  constructor() {
    super();

    this.logger = winston.createLogger({
      transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'logs/combined.log' }),
      ],
      format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.printf(info => `${info.timestamp} [${info.level.toUpperCase()}] - ${info.message}`)
      ),
    });
  }

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

  error(message: string, trace: string) {
    this.logger.error(message, trace);
  }

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

NestJS에서 기본적으로 제공하는 Logger 클래스를 상속하여 위와 같이 LoggerService를 만들 수 있습니다. logger 인스턴스는 Winston의 Logger를 생성하고, 콘솔과 파일로 로그를 기록할 수 있습니다. 로그 포맷은 날짜 및 시간, 로그 레벨, 메시지를 포함하도록 설정되어 있습니다.

로그 레벨을 조정하여 필요한 정보만 로그로 남길 수 있습니다. 기본적으로는 info, error, warn 레벨이 존재하며, 필요에 따라 커스텀 레벨을 추가할 수도 있습니다.

로그 서비스를 사용하기 위해 해당 모듈에서 LoggerService를 제공되는 모듈로 등록해야 합니다.

모니터링

NestJS 애플리케이션의 실시간 모니터링을 위해 Socket.IO를 사용할 수 있습니다. Socket.IO는 웹 소켓을 이용한 양방향 통신을 지원하여 실시간 데이터를 애플리케이션이나 클라이언트에 전송할 수 있습니다.

먼저, Socket.IO를 설치합니다:

$ npm install socket.io

다음으로, 모니터링을 위한 monitoring.gateway.ts 파일을 생성하고 다음과 같이 작성합니다:

import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets';
import { Logger } from '@nestjs/common';
import * as socketio from 'socket.io';

@WebSocketGateway({ namespace: 'monitoring' })
export class MonitoringGateway {
  private logger: Logger;
  private io: socketio.Server;

  constructor() {
    this.logger = new Logger('MonitoringGateway');
    this.io = socketio();
  }

  handleConnection(client: socketio.Socket) {
    this.logger.log('Client connected');
  }

  handleDisconnect(client: socketio.Socket) {
    this.logger.log('Client disconnected');
  }

  @SubscribeMessage('monitor')
  handleMonitor(client: socketio.Socket, data: any) {
    // 모니터링 로직
  }
}

WebSocketGateway 데코레이터를 사용하여 NestJS의 웹 소켓 게이트웨이를 생성합니다. MonitoringGateway 클래스에서는 클라이언트의 연결 및 연결 해제 이벤트를 처리하고, handleMonitor 메서드에서 실시간 모니터링 로직을 구현할 수 있습니다.

모니터링 로직에서는 필요한 데이터를 수집하고 클라이언트에게 원하는 형태로 전달하는 작업을 수행할 수 있습니다.

마지막으로, 모듈에서 MonitoringGateway를 제공되는 모듈로 등록해야 합니다.

마치며

이렇게 NestJS 애플리케이션에서 실시간 로깅과 모니터링을 구현하는 방법에 대해 알아보았습니다. 로깅은 애플리케이션의 동작을 추적하고 디버깅할 때 유용하며, 모니터링은 애플리케이션의 성능과 상태를 실시간으로 확인하기 위해 사용됩니다. 이러한 과정을 통해 애플리케이션의 안정성과 효율성을 높일 수 있습니다.

#NestJS #로깅 #모니터링