ERP-node/backend-node/src/utils/logger.ts

67 lines
1.5 KiB
TypeScript

import winston from "winston";
import config from "../config/environment";
// 로그 포맷 정의
const logFormat = winston.format.combine(
winston.format.timestamp({
format: "YYYY-MM-DD HH:mm:ss",
}),
winston.format.errors({ stack: true }),
winston.format.json()
);
// 콘솔 포맷 (개발 환경용)
const consoleFormat = winston.format.combine(
winston.format.colorize(),
winston.format.timestamp({
format: "YYYY-MM-DD HH:mm:ss",
}),
winston.format.printf(({ timestamp, level, message, stack }) => {
if (stack) {
return `${timestamp} [${level}]: ${message}\n${stack}`;
}
return `${timestamp} [${level}]: ${message}`;
})
);
// 로거 생성
export const logger = winston.createLogger({
level: config.logging.level,
format: logFormat,
transports: [
// 파일 로그 (에러)
new winston.transports.File({
filename: "logs/error.log",
level: "error",
maxsize: 5242880, // 5MB
maxFiles: 5,
}),
// 파일 로그 (전체)
new winston.transports.File({
filename: "logs/combined.log",
maxsize: 5242880, // 5MB
maxFiles: 5,
}),
],
});
// 개발 환경에서는 콘솔 출력 추가
if (config.nodeEnv !== "production") {
logger.add(
new winston.transports.Console({
format: consoleFormat,
})
);
}
// 로그 디렉토리 생성
import fs from "fs";
import path from "path";
const logsDir = path.join(process.cwd(), "logs");
if (!fs.existsSync(logsDir)) {
fs.mkdirSync(logsDir, { recursive: true });
}
export default logger;