[Node.js]Logging 모듈 winston이란?

resilient

·

2021. 6. 17. 15:03

728x90
반응형

Nodejs로 Express 서버를 만들 때 디버깅용도로  console.log를 자주 사용했었다.

하지만 한계가 있고, Project를 실제 수행하다보면 서버의 동작을 파악하거나 오류를 찾아야 할때 로그파일을 뒤져보는 것이 중요하다고 느꼈다. 그래서 이번에는 Logging을 돕는 winston 라이브러리에 대해서 알아보려고 한다.

다음과 같이 npm 으로 설치를 해준다.

winston winston-daily-rotate-file를 설치한다. 

winston은 로그를 남기는 라이브러리이고, winston-daily-rotate-file은 1일 단위로 로그를 쌓도록 관리해주는 라이브러리이다.

npm install --save winston winston-daily-rotate-file

npm install을 하다보면 앞에 --save 나 -g 등등을 붙이는 경우를 볼 수가 있는데 이는 npm install option이라고 한다.

다음에 정리해봐야겠다.

 

로그를 관리하는 모듈을 따로 패키지 형태로 작성하려한다.

우선 아래와 같은 파일을 작성했다. 주석을 보면 winston 설정에 대해서 알 수 있다.

 

먼저 여기 블로그를 보면서 내가 프로젝트를 할 때 사용하는 winston파일을 만들었고 설명은 다음과 같다.

  • 콘솔창에 로그를 남긴다.
  • 콘솔창의 로그는 컬러로 찍힌다.
  • 로그 파일을 남긴다.
  • 콘솔창은 info 레벨부터 로그를 남기고, 로그 파일에는 debug 레벨부터 로그를 남긴다.
  • 로그 파일은 매일 하나씩 남긴다.
  • log 폴더에 로그 파일을 쌓는다.
  • 로그 파일은 최대 20Mbyte다.
  • 로그 파일은 14일간 보관한다.
  • 로그 파일은 압축한다.
  • 개발 환경에서는 debug 레벨부터 로그를 찍고, 운영 환경에서는 info 레벨부터 로그를 찍는다.

파일 코드내용은 아래와 같다.

const { createLogger, format, transports } = require('winston');
require('winston-daily-rotate-file');
const fs = require('fs');

const env = process.env.NODE_ENV || 'development';
const logDir = 'log';

// Create the log directory if it does not exist
if (!fs.existsSync(logDir)) {
    fs.mkdirSync(logDir)
}

const dailyRotateFileTransport = new transports.DailyRotateFile({
    level: 'debug',
    filename: `${logDir}/%DATE%-smart-push.log`,
    datePattern: 'YYYY-MM-DD',
    zippedArchive: true,
    maxSize: '20m',
    maxFiles: '14d'
});

const logger = createLogger({
    level: env === 'development' ? 'debug' : 'info',
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        format.json()
    ),
    transports: [
        new transports.Console({
            level: 'info',
            format: format.combine(
                format.colorize(),
                format.printf(
                    info => `${info.timestamp} ${info.level}: ${info.message}`
                )
            )
        }),
        dailyRotateFileTransport
    ]
});

module.exports = {
    logger: logger
};

 

반응형