Study/Javascript | Typescript | Node.js

[node.js] logger 파일 생성하기

nam-willow 2024. 12. 21. 01:39

참고 블로그

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


 

/logs/logger.js
logger 미들웨어 작성

const winston = require("winston");
const winstonDaily = require("winston-daily-rotate-file");
//const process = require("process");
const appRoot = require("app-root-path");

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

//로그파일 저장 경로 -> 루트 경로/logs 폴더
const logDir = `${appRoot}/logs`;
// console.log("logDir", logDir);

// log 출력 포맷 정의 함수
const logFormat = printf(({ level, message, label, timestamp, meta }) => {
  const route = meta?.route || "N/A"; // route 정보를 meta에서 가져옴
  return `${timestamp} [${label}] ${route} | ${level}: ${message}`; // 원하는 포맷
});
//winston 로거 생성
const logger = winston.createLogger({
  //* 로그 출력 형식 정의
  format: combine(
    timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
    label({ label: "Node_project" }),     // 어플리케이션 이름
    logFormat                              // log 출력 포맷
    //? format: combine() 에서 정의한 timestamp와 label 형식값이 logFormat에 들어가서 정의되게 된다. level이나 message는 콘솔에서 자동 정의
  ),

  // 실제 로그를 어떻게 기록을 한 것인가 정의
  transports: [
    // info 레벨 로그를 저장할 파일 설정 (info: 2 보다 높은 error: 0 와 warn: 1 로그들도 자동 포함해서 저장)
    new winstonDaily({
      level: "info",                 // info 레벨에선
      datePattern: "YYYY-MM-DD",     // 파일 날짜 형식
      dirname: logDir,                 // 파일 경로
      filename: `%DATE%.log`,         // 파일 이름
      maxFiles: 30,                 // 최근 30일치 로그 파일을 남김
      zippedArchive: true,             // 아카이브된 로그 파일을 gzip으로 압축할지 여부
    }),

    // error 레벨 로그를 저장할 파일 설정 (info에 자동 포함되지만 일부러 따로 빼서 설정)
    new winstonDaily({
      level: "error",                 // error 레벨에선
      datePattern: "YYYY-MM-DD",
      dirname: logDir + "/error",     // /logs/error 하위에 저장
      filename: `%DATE%.error.log`, // 에러 로그는 2020-05-28.error.log 형식으로 저장
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],

  // uncaughtException 발생시 파일 설정
  exceptionHandlers: [
    new winstonDaily({
      level: "error",
      datePattern: "YYYY-MM-DD",
      dirname: logDir,
      filename: `%DATE%.exception.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],
});
/**
 * API 로그를 남길 커스텀 메서드 추가
 * @param {String} level "log레벨"
 * @param {String} message "log 남길 메세지"
 * @param {String} route "POST /selvas/measure"
 */
logger.apiLog = (level, message, route) => {
  logger.log({
    level,
    message,
    meta: { route },
  });
};


module.exports = logger;

 

controller.js
라우터 경로를 보내는 방법

      const methodUrl = `${req.method} ${req.url}`;
      const result = await services.hcMeasureResultSet(req.body, methodUrl);

 

services.js
로깅방법

logger.apiLog("error", "selvas user_info not defined", methodUrl);



프로젝트를 실행하면 이렇게 파일이 생성된다… 이부분 수정이 필요해보임

  • 2024-12-09.error.log,
  • 2024-12-09.exception.log
  • 2024-12-09.exceptions.log
  • 2024-12-09.log
  • /error/2024-12-09.error.log