수학적 접근

[2022/10/07] 라이언의 개발일지 본문

개발일지/2022

[2022/10/07] 라이언의 개발일지

평등수렴 2022. 10. 7. 17:12
반응형

PoLAB API - 서버 로그 찍기

  • 서버 로그를 찍기 위해 사용하는 패키지: winston
  • winston, winston-daily-rotate-file 설치
  • winston-daily-rotate-file 은 로그를 일자별로 파일 저장하기 위해 사용함
  • 아래 블로그 참고하여 기능 구현
 

[NODE] 📚 Winston 모듈 사용법 - 서버 로그 관리

Winston 모듈 어떤 서버든지 실제로 서비스를 운영하려면 로그를 꼼꼼히 남기는 것은 필수이다. Log는 에러를 파악할 수 있는 열쇠이기 때문에 서버를 운영한다고 하면 로그 시스템을 구축해서 시

inpa.tistory.com

  • 최종적으로 완성한 logger.js
import winston from 'winston';
import winstonDaily from 'winston-daily-rotate-file';
import process from 'process';
import dotenv from 'dotenv';
import util from 'util';

dotenv.config(); // NODE_ENV 정의

const { combine, timestamp, label, printf } = winston.format;
const logDir = `${process.cwd()}/logs`;
const logFormat = printf(({ level, message, label, timestamp }) => {
   level = level.toUpperCase();
   return `${timestamp} [${label}] ${level}: ${util.format('%o', message)}`
});


/*
 * Log Level
 * error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6
 */
const logger = winston.createLogger({
   //* 로그 출력 형식 정의
   format: combine(
      timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
      label({ label: '***' }), // 어플리케이션 이름
      logFormat, // log 출력 포맷
      //? format: combine() 에서 정의한 timestamp와 label 형식값이 logFormat에 들어가서 정의되게 된다. level이나 message는 콘솔에서 자동 정의
   ),
   //* 실제 로그를 어떻게 기록을 한 것인가 정의
   transports: [
      //* 전체 레벨 로그를 저장할 파일 설정
      new winstonDaily({
         level: 'silly',
         datePattern: 'YYYY-MM-DD', 
         dirname: logDir, // 파일 경로
         filename: `***`,
         maxFiles: 365, 
         zippedArchive: true,
      }),
      //* info 레벨 로그를 저장할 파일 설정 (info: 2 보다 높은 error: 0 와 warn: 1 로그들도 자동 포함해서 저장)
      new winstonDaily({
         level: 'info', 
         datePattern: 'YYYY-MM-DD',
         dirname: logDir, // 파일 경로
         filename: `***`, 
         maxFiles: 365, 
         zippedArchive: true,
      }),
      //* error 레벨 로그를 저장할 파일 설정 (info에 자동 포함되지만 일부러 따로 빼서 설정)
      new winstonDaily({
         level: 'error', 
         datePattern: 'YYYY-MM-DD',
         dirname: logDir + '/error', 
         filename: `***`, 
         maxFiles: 365,
         zippedArchive: true,
      }),
   ],
   //* uncaughtException 발생시 파일 설정
   exceptionHandlers: [
      new winstonDaily({
         level: 'error',
         datePattern: 'YYYY-MM-DD',
         dirname: logDir,
         filename: `***`,
         maxFiles: 365,
         zippedArchive: true,
      }),
   ],
});


//* Production 환경이 아닌, 개발 환경일 경우 파일 들어가서 일일히 로그 확인하기 번거로우니까 화면에서 바로 찍게 설정 (로그 파일은 여전히 생성됨)
if (process.env.NODE_ENV !== 'production') {
   logger.add(
      new winston.transports.Console({
         format: winston.format.combine(
            winston.format.colorize(), // 색깔 넣어서 출력
            timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
            label({ label: '***' }),
            logFormat,
         ),
      }),
   );
}


/* 기타 필요한 유틸리티 메서드 정의함 (생략) */

export default logger;
export {
	//유틸리티 메서드들   
};
  • util.format : json 형식의 로그를 제대로 출력하기 위해서 사용. 따로 처리하지 않으면 [Object object] 와 같이 표시된다.
  • dev에서 테스트 후 본 서버 적용 완료
  • 본 서버 적용 중 log 저장 디렉토리에 permission 에러가 발생하여 이를 해결함

금요일이니까 일찍 들어가자!

반응형
Comments