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