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;