본문 바로가기
Runtime/Node.js

20. 로그 관리

by 김엉배 2023. 4. 18.
728x90
반응형

 

- 로그는 시스템을 운영할 때 발생하는 모든 데이터를 말한다.

   로그를 관리하는  데 사용하는 가장 대표적인 Node.js 모듈인 winston(https://npmjs.com/package/winston)을 사용해 로그 관리

 

  • winston을 터미널에서 명령어를 통해 설치
npm install winston

 

 

  • Node.js로 서버를 구축해 사용하면서 로그를 정밀히 관리하지 않고 단순히 콘솔로 로그를 출력하는 경우가 많은데, 
    그러면 콘솔 화면을 계속 볼 수도 없고 콘솔을 통해 확인 가능한 글자의 수도 제한적이기에 이미 지난 오류에 대한 추적이 어렵다.

  • 로그는 시스템을 운영하면서 예기치 못한 오류 혹은 치명적인 장애가 발생했을 때 장애 원인을 추적하고 시스템을 안정적으로
    운영하기 위해 제대로 관리해야 한다.
const winston = require('winston'); // winston 모듈
const winstonDaily = require('winston-daily-rotate-file'); // 로그파일을 일자별로 생성 
const appRoot = require('app-root-path'); // app root 경로를 가져오는 lib
const process = require('process');

const logDir = `${apRoot}/logs`; // logs 디렉토리 하위에 로그 파일 저장

const {combine, timestamp, label, printf} = winston.format;

const logFormat = printf(({level, message, label, timestamp}) => {
  return `${timestamp} [${label}] ${level}: ${message}`; // 로그 출력 포맷 정의
});

const logger = winston.createLogger({
  format: combine(
    label({
      lable: 'System Name'
    }),
    timestamp({
      format: 'YYYY-MM-DD HH:mm:ss'
    }),
    logFormat
  ),
  transports: [
    new winstonDaily({  // info 레벨 로그를 저장할 파일 설정
      level: 'info',
      datePattern: 'YYYY-MM-DD',
      dirname: logDir,
      filename: `%DATE%.log`,
      maxFiles: 30, // 최근 30일치 로그 파일만 저장
      zippedArchiv: true
    }),
    new winstonDaily({
      level: 'error',
      datePattern: 'YYYY-MM-DD',
      dirname: logDir,
      filename: `%DATE%.error.log`,
      maxFiles: 30, // 최근 30일치 로그 파일만 저장
      zippedArchiv: true
    })
  ],
  exceptionHandlers: [  // uncaughtException 발생시
    new winstonDaily({
      level: 'error',
      datePattern: 'YYYY-MM-DD',
      dirname: logDir,
      filename: `%DATE%.exception.log`,
      maxFiles: 30, // 최근 30일치 로그 파일만 저장
      zippedArchiv: true
    })
  ]
})

// 운영 환경이 아닌 경우 콘솔로도 로그 출력
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.combine(
      winston.format.colorize(), // 색상 넣어서 출력
      winston.format.simple() // 간단한 포맷으로 출력
    )
  }));
}

module.exports = logger;
728x90
반응형

'Runtime > Node.js' 카테고리의 다른 글

22. 메일링 서비스(이메일 보내기)  (2) 2023.04.18
21. 메일링 서비스(Nodemailer)  (7) 2023.04.18
19. MongoDB(스키마, 모델 생성)  (2) 2023.04.14
18. MongoDB(mongoose 모듈)  (5) 2023.04.10
17. MongoDB(툴 설치 및 준비)  (3) 2023.04.10