로깅(logging)은 어플리케이션에서 발생하는 모든 오류 및 정보등 각종 이벤트를 남기는 것으로, 문제 발생 시 원인을 파악하는데 매우 중요한 역할을 합니다.
현재 테크팀은 스프링 프레임워크의 경우 logback을 이용하여 로깅 처리를 하고 있으며, 일명 ELK(Elasticsearch, Logstash, Kibana)를 구성하여 로깅 정보를 집계하고 확인하고 있습니다.
NestJS 프레임워크 역시 이러한 로깅 처리는 매우 중요한 기능이였고, 고민하지 않고 Node.js에서 사용하던 winston log 모듈을 사용하기로 결정 하였습니다.
Node.js에서 log를 효율적으로 관리할 수 있게 도와주는 모듈인 winston log 모듈은 실제 서버를 운영할 때 console.log와 console.error 를 대체하기 위한 모듈입니다.
해당 모듈을 사용하여 개발도중에 console에 로그도 확인할 수 있지만 외부에 파일을 저장해서 관리도 가능하며, Logstash를 이용하여 ELK를 구성하여 로깅 정보를 효율적으로 확인할 수 있습니다.
Winston log 모듈 사용법
"dependencies": {
"nest-winston": "^1.9.4",
"winston": "^3.11.0",
"winston-daily-rotate-file": "^4.7.1",
"winston-logstash": "^1.2.1"
},
package.json에 다음을 추가하고 패키지를 설치하자.
const transports = [
// Console 설정
new winston.transports.Console({
level: env === 'development' ? 'debug' : 'error',
format:
env === 'development'
? winston.format.combine(
winston.format.timestamp(),
nestWinstonModuleUtilities.format.nestLike(applicationName, {
prettyPrint: true,
}),
)
: winston.format.simple(),
}),
// Daily File 설정
new winstonDaily({
level: env === 'development' ? 'debug' : 'error',
datePattern: 'YYYY-MM-DD',
dirname: __dirname + '/../../logs',
filename: `app.log.%DATE%`,
maxSize: '100m',
maxFiles: '14d',
zippedArchive: true,
colorize: false,
handleExceptions: true,
json: false,
}),
// Logstash 설정
new LogstashTransport({
host: 'host 정보',
port: port정보,
node_name: applicationName,
}),
];
// Winston Logger 모듈 생성
const winstonLogger = WinstonModule.createLogger({
transports: transports,
// 포멧 지정
format: winston.format.combine(
appendTimestamp({ tz: 'Asia/Seoul' }),
winston.format.json(),
winston.format.printf(({ level, message, context, timestamp }) => {
return `[${applicationName}] ${level} ${timestamp} [${
context ? context : ''
}] [${process.pid}] : ${message}`;
}),
),
exitOnError: false,
});
다음과 같이 로깅 옵션을 설정하고 Logger 모듈을 생성하여 준다.
옵션을 위에서부터 간단하게 설명하자면, Console, File, Logstash 3가지에 대한 설정이다.
app.useLogger(winstonLogger);
private readonly logger = new Logger('TestLog');
logger.log('test log');
winston 로그 모듈을 app 기본 logger 객체로 설정하고 로그를 사용하면 된다.
다음과 같이 file이 생성되며, 로그 내용을 확인할 수 있으며, Kibana에서도 정상적으로 로그 내용을 확인할 수 있습니다.
이상 로깅(logging)에 대한 글을 마치며, 다음글에서는 스웨거(Swagger) 설정 방법에 대해 간단하게 설명하도록 하겠습니다.
'Backend(Framework) > NestJS' 카테고리의 다른 글
NestJS Cors와 Cookie설정 (0) | 2023.12.02 |
---|---|
NestJS Yaml 파일 설정 관리 (1) | 2023.12.02 |
NestJS 스웨거(Swagger) 설정 (1) | 2023.12.02 |
NestJS 요청 생명 주기(NestJS Request LifeCycle) (0) | 2023.11.30 |
NestJS를 사용하게 된 이유 (2) | 2023.11.30 |