import rTracer from "cls-rtracer"; import dotenv from "dotenv"; import path from "path"; import { createLogger, format, transports } from "winston"; import DailyRotateFile from "winston-daily-rotate-file"; dotenv.config(); const initLogger = () => { const isProduction = process.env.NODE_ENV === "production"; const consoleFormat = format.combine( format.colorize(), format.timestamp(), format.align(), format.splat(), format.errors({ stack: !isProduction }), format.printf((info) => { const rid = rTracer.id(); let out = isProduction && rid ? `${info.timestamp} [request-id:${rid}] - ${info.level}: [${info.label}]: ${info.message}` : `${info.timestamp} - ${info.level}: [${info.label}]: ${info.message}`; if (info.metadata?.error) { out = `${out} ${info.metadata.error}`; if (info.metadata?.error?.stack) { out = `${out} ${info.metadata.error.stack}`; } } return out; }) ); const fileFormat = format.combine( format.timestamp(), format.splat(), format.label({ label: path.basename(String(require.main?.filename)) }), //format.metadata(), format.metadata({ fillExcept: ["message", "level", "timestamp", "label"] }), format.simple(), format.json() ); const logger = createLogger({ level: isProduction ? "error" : "debug", format: fileFormat, transports: [ new DailyRotateFile({ dirname: isProduction ? "/logs" : ".", filename: "error-%DATE%.log", datePattern: "YYYY-MM-DD", utc: true, level: "error", maxSize: "5m", maxFiles: "1d", }), new DailyRotateFile({ dirname: isProduction ? "/logs" : ".", filename: "debug-%DATE%.log", datePattern: "YYYY-MM-DD", utc: true, level: "debug", maxSize: "5m", maxFiles: "1d", }), ], }); // // If we're not in production then log to the `console` with the format: // `${info.level}: ${info.message} JSON.stringify({ ...rest }) ` // //if (!config.isProduction) { logger.add( new transports.Console({ format: consoleFormat, level: "debug", }) ); //} return logger; }; const logger = initLogger(); export { logger };