const winston = require("winston"); const path = require("path"); require("dotenv").config(); // Define log format const logFormat = winston.format.combine( winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston.format.errors({ stack: true }), winston.format.splat(), winston.format.json() ); // Console format for development const consoleFormat = winston.format.combine( winston.format.colorize(), winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston.format.printf(({ timestamp, level, message, ...meta }) => { let msg = `${timestamp} [${level}]: ${message}`; if (Object.keys(meta).length > 0) { msg += ` ${JSON.stringify(meta)}`; } return msg; }) ); // Create logs directory if it doesn't exist const fs = require("fs"); const logsDir = path.join(__dirname, "..", "logs"); if (!fs.existsSync(logsDir)) { fs.mkdirSync(logsDir, { recursive: true }); } // Create logger instance const logger = winston.createLogger({ level: process.env.LOG_LEVEL || "info", format: logFormat, defaultMeta: { service: "skyartshop" }, transports: [ // Error logs new winston.transports.File({ filename: path.join(logsDir, "error.log"), level: "error", maxsize: 10485760, // 10MB maxFiles: 5, }), // Combined logs new winston.transports.File({ filename: path.join(logsDir, "combined.log"), maxsize: 10485760, // 10MB maxFiles: 5, }), ], }); // Add console transport in non-production if (process.env.NODE_ENV !== "production") { logger.add( new winston.transports.Console({ format: consoleFormat, }) ); } // Create a stream for Morgan HTTP logger logger.stream = { write: (message) => logger.info(message.trim()), }; module.exports = logger;