프로젝트에서 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모듈을 사용해서 로그를 출력하도록 설정한다
'과거공부모음' 카테고리의 다른 글
node.js 이벤트 루프(event loop) (0) | 2023.04.13 |
---|---|
node.js 콜백(callback) (0) | 2023.04.13 |
TypeORM 추진 추천 쿼리 (0) | 2023.04.02 |
Nest.js에서 Google Vision API 사용하기 (0) | 2023.04.01 |
Nest.js에서 이미지를 S3에 업로드 (0) | 2023.04.01 |