본문 바로가기

카테고리 없음

Node.js express winston logger 설치 및 운영

728x90

Node.js 를 개발할 때는 주로 console.log 나 console.warn, error 등을 써가면서 버그를 찾고 개발하곤 했다. 하지만 고객의 수가 늘어나고 이런저런 문제를 접하다 보니 안정적인 로깅 환경을 위해 winston 과 같은 전문 logging 시스템을 도입하고자 했다.

이를 사용하는 방법과 필자가 사용한 세팅에 대해서 설명하고자 한다.

 

https://github.com/winstonjs/winston

 

GitHub - winstonjs/winston: A logger for just about everything.

A logger for just about everything. Contribute to winstonjs/winston development by creating an account on GitHub.

github.com

 

필자의 경우 debug 용 logger, production 용의 logger 를 나누어서 사용중이다.

 

const debugLogger = require('./debugLogger');
const productionLogger = require('./productionLogger');

let logger = null;

if (process.env.NODE_ENV !== 'production') {
  logger = debugLogger();
} else {
  logger = productionLogger();
}

module.exports = logger;

 

# 디버그용 logger (debugLogger.js)

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;

const debugLogger = () => {
  const myFormat = printf(({ level, message, timestamp }) => {
    return `${timestamp} ${level}: ${message}`;
  });

  return createLogger({
    level: 'debug',
    format: combine(format.colorize(), timestamp({ format: 'HH:mm:ss' }), myFormat),
    transports: [new transports.Console()],
  });
};

module.exports = debugLogger;

 

# Production 환경 logger (productionLogger.js)

const { createLogger, format, transports } = require('winston');
const WinstonDaily = require('winston-daily-rotate-file');
const path = require('path');
const { combine, timestamp, json } = format;
const logDir = `../../../logs`;

const productionLogger = () => {
  return createLogger({
    level: 'debug',
    format: combine(timestamp(), json()),
    transports: [
      new transports.Console(),
      // error 레벨 로그 - 파일저장
      new WinstonDaily({
        level: 'error',
        datePattern: 'YYYY-MM-DD',
        dirname: path.join(__dirname, logDir, '/error'),
        filename: '%DATE%.error.log',
        maxFiles: 30,
        zippedArchive: true,
      }),
      // 모든 레벨 로그 - 파일저장
      new WinstonDaily({
        level: 'debug',
        datePattern: 'YYYY-MM-DD',
        dirname: path.join(__dirname, logDir, '/all'),
        filename: '%DATE%.all.log',
        maxFiles: 7,
        zippedArchive: true,
      }),
    ],
  });
};

module.exports = productionLogger;

 

 

참고

https://www.youtube.com/watch?v=A5YiqaQbsyI