import * as winston from 'winston'; import DailyRotateFile from 'winston-daily-rotate-file'; import * as path from 'path'; const logDir = path.join(process.cwd(), 'logs'); // 日志格式 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.printf(({ timestamp, level, message, context, stack }) => { let log = `${timestamp} [${level}]`; if (context) { log += ` [${context}]`; } log += ` ${message}`; if (stack) { log += `\n${stack}`; } return log; }), ); // 控制台传输 const consoleTransport = new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), logFormat, ), }); // 应用日志传输(按天轮转) const appLogTransport = new DailyRotateFile({ dirname: logDir, filename: 'application-%DATE%.log', datePattern: 'YYYY-MM-DD', maxSize: '20m', maxFiles: '30d', format: logFormat, }); // 错误日志传输(按天轮转) const errorLogTransport = new DailyRotateFile({ dirname: logDir, filename: 'error-%DATE%.log', datePattern: 'YYYY-MM-DD', level: 'error', maxSize: '20m', maxFiles: '30d', format: logFormat, }); // 创建 winston logger 实例 export const winstonLogger = winston.createLogger({ level: process.env.LOG_LEVEL || 'info', format: logFormat, transports: [ consoleTransport, appLogTransport, errorLogTransport, ], exitOnError: false, });