본문 바로가기

과거공부모음

Nest.js log를 파일로 만들어서 관리 (logging)

프로젝트에서 error나 warn의 log들을 모아서 관리하는 logging 시스템을 작업했는데 복습하면서 정리해 보도록 한다

 

Nest.js에서는 logging을 할 때 Node.js의 winston패키지를 사용한다

 

먼저 패키지 nest-winston과 winston을 설치한다

npm install nest-winston winston

 

그리고 winston을 설정하는 utill 파일을 만든다

import { utilities, WinstonModule } from 'nest-winston';
import * as winston from 'winston';
import path from 'path';

const env = process.env.NODE_ENV;

const dailyOptions = (level: string) => {
  return new winston.transports.File({
    level,
    filename: path.join('logs', level, `${level}.log`),
    maxsize: 1024 * 1024 * 10,
  });
};

export const winstonLogger = WinstonModule.createLogger({
  transports: [
    new winston.transports.Console({
      level: env === 'production' ? 'info' : 'debug',
      format:
        env === 'production'
          ? winston.format.simple()
          : winston.format.combine(
              winston.format.timestamp({}),
              winston.format.colorize(),
              utilities.format.nestLike('chalkak', {
                prettyPrint: true,
              })
            ),
    }),
    new winston.transports.File({ filename: path.join('logs', 'combine', 'combined.log') }),
    dailyOptions('info'),
    dailyOptions('warn'),
    dailyOptions('error'),
  ],
});

process.env.NODE_ENV를 통해서 현재 환경이 개발환경인지 운영환경인지 판별한다

보통 배포환경은 기본값이 production으로 설정되어 운영환경이라고 한다

 

dailyOptions는 로그레벨에 따라서 파일을 저장합니다 최대 크기는 10MB로 제한해서 하나의 로그 파일이 너무 크지 않게 한다

 

WinstonModule.createLogger를 사용해서 logger를 생성한다

transports로 모듈을 출력하는 방식을 정의한다

 

Console은 콘솔에 로그를 출력하는 방식을 정의한다

개발환경에서는 debug 레벨로 운영환경에서는 info 레벨로 로그를 출력합니다

debug레벨은 디버깅 메시지를 출력한다 애플리케이션의 동작을 추적하고 분석하는 사용되어 운영환경에서는 사용하는 게 좋지 못하다

info레벨은 일반적인 실행 정보를 출력한다 시스템 작동 모니터링에 좋아 운영환경에서 좋다

 

개발환경에서는 날짜/시간, 로그레벨, 로그 메시지, 색상화된 포맷을 적용하고

운영환경에서는 단순한 문자열만 출력한다

이렇게 한 이유는 운영환경에서 조금이라도 로그가 잡아먹는 성능을 줄이기 위해서다

 

그 후 레벨 별 파일을 저장하도록 dailyOptions에 레벨을 인수로 넣어 호출합니다

new winston.transports.File({ filename: path.join('logs', 'combine', 'combined.log') })은 모든 로그를 한 파일 저장하는데

필요성을 느끼지 못해서 제거할 예정이다

 

이제 Nest.js에 logger를 winston으로 바꾸러 가보자

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import cookieParser from 'cookie-parser';
import { AppModule } from './app.module';
import { winstonLogger } from './common/logging/winston.util';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {logger: winstonLogger});
  app.enableCors({
    // origin: 'http://localhost:3000',
    origin: true,
    credentials: true,
  });
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    })
  );
  app.use(cookieParser());
  await app.listen(8080);
}
bootstrap();

NestFactory.create(AppModule) Nest.Js 애플리케이션 인스턴스를 생성할 때 logger옵션을 기본 logger에서 winstonLogger를 지정하여 winston모듈을 사용해서 로그를 출력하도록 설정한다