const fs = require("fs"); const path = require("path"); const winston = require("winston"); const DailyRotateFile = require("winston-daily-rotate-file"); const config = require("./config"); function resolveLogDir() { const dirFromConfig = (config.log && config.log.dir) || "logs"; const appRoot = process.pkg ? path.dirname(process.execPath) : path.resolve(__dirname, ".."); return path.isAbsolute(dirFromConfig) ? dirFromConfig : path.resolve(appRoot, dirFromConfig); } const logDir = resolveLogDir(); try { if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } } catch (_) {} const logLevel = (config.log && config.log.level) || "info"; const enableFileLog = !config.log || config.log.toFile !== false; const logFormat = winston.format.combine( winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }), winston.format.errors({ stack: true }), winston.format.printf((info) => { const base = `[${info.timestamp}] [${info.level.toUpperCase()}] ${info.message}`; const extra = { ...info }; delete extra.level; delete extra.message; delete extra.timestamp; const hasExtra = Object.keys(extra).length > 0; if (!hasExtra) return base; try { return `${base} ${JSON.stringify(extra)}`; } catch (_) { return base; } }) ); const transports = [ new winston.transports.Console({ level: logLevel }) ]; if (enableFileLog) { transports.push( new DailyRotateFile({ level: logLevel, dirname: logDir, filename: "gateway-%DATE%.log", datePattern: "YYYY-MM-DD", maxSize: "50m", maxFiles: "30d" }) ); transports.push( new DailyRotateFile({ level: "error", dirname: logDir, filename: "gateway-error-%DATE%.log", datePattern: "YYYY-MM-DD", maxSize: "50m", maxFiles: "30d" }) ); } const baseLogger = winston.createLogger({ level: logLevel, format: logFormat, transports, exitOnError: false }); const logger = { debug(message, extra) { if (extra === undefined) baseLogger.debug(message); else baseLogger.debug(message, extra); }, info(message, extra) { if (extra === undefined) baseLogger.info(message); else baseLogger.info(message, extra); }, warn(message, extra) { if (extra === undefined) baseLogger.warn(message); else baseLogger.warn(message, extra); }, error(message, extra) { if (extra === undefined) baseLogger.error(message); else baseLogger.error(message, extra); } }; module.exports = logger;