winston으로 로그 쌓기

로그를 레벨별로 관리해야 하는 이유

로그는 개발 및 유지보수를 도와주는 아주 중요한 기록이다. 하지만 너무 많은 로그는 시스템의 성능에 영향을 미치고, 디스크 공간을 차지한다. 따라서 로그를 다양한 레벨로 나누고, 필요한 정보만 기록하도록 구현해야 한다.

  1. DEBUG 레벨
  2. INFO 레벨
  3. WARN 레벨
  4. ERROR 레벨
  5. FATAL 레벨

winston은 다양한 로깅 레벨을 지원하기 때문에 각 레벨에 따라 서로 다른 유형의 로그 메시지를 생성할 수 있다. 게다가 파일, 콘솔, 데이터베이스 등 다양한 형식으로 로그를 남길 수 있다.

winton-dailly-rotate-file로 로그 날짜별로 관리하기

하나의 error 로그 파일에 모든 error 로그가 다 들어있다면, 파일이 너무 커져 디버깅하기 어렵다. winton-daily-rotate-file 을 이용하면 날짜별로 새로운 로그 파일을 생성하고, 일정 기간이 지난 로그 파일은 자동으로 삭제할 수 있다.

function createDailyRotateFile(level: string): DailyRotateFile {
  ...
  return new DailyRotateFile({
    level: level,
    dirname: dirname,
    filename: `${level}-%DATE%.log`,
    datePattern: 'YYYY-MM-DD',
    zippedArchive: true, // 압축하여 저장
    maxSize: '20m',
    maxFiles: '14d', // 14일이 지난 로그는 자동으로 삭제
  });
}

export const debugTransports = new transports.Console({ // dbug 레벨의 로그는 콘솔로 남김
  level: 'debug',
});
export const infoTransports: DailyRotateFile = createDailyRotateFile('info');
export const warnTransports: DailyRotateFile = createDailyRotateFile('warn');
export const errorTransports: DailyRotateFile = createDailyRotateFile('error');

winston은 info, warn, error, debug 로그 레벨을 지원한다. 디스크 공간이 낭비되는 것을 막기 위해 debug 레벨은 콘솔로 남기기로 결정했다. zippedArchive를 통해 로그 파일을 압축하여 저장하도록 설정했고, maxFiles14d로 지정하여 14일이 지난 로그는 자동으로 삭제하도록 만들었다.

도커 volume을 설정하여 호스트 서버와 로그 공유하기

현재 어플리케이션을 도커 컨테이너로 띄우고 있다. volume을 설정하여 호스트 서버에 로그를 남길 것이다.