const winston = require('winston'); require('winston-daily-rotate-file'); function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // 配置日志格式 const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.printf(info => `${formatDate(new Date(info.timestamp))} [${info.level}] ${info.message}`) ), transports: [ // 输出到控制台(可选) new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), winston.format.printf(info => `${info.timestamp} [${info.level}] ${info.message}`) ) }), // 每天轮转的日志文件 new winston.transports.DailyRotateFile({ filename: 'logs/info-%DATE%.log', // 日志文件名模式 datePattern: 'YYYY-MM-DD', // 日期格式 zippedArchive: true, // 归档旧日志文件时压缩 maxSize: '20m', // 文件最大大小 maxFiles: '14d', // 保留最近14天的日志文件 level: 'info' // 设置此传输的最低日志级别 }), // 错误日志文件 new winston.transports.DailyRotateFile({ filename: 'logs/error-%DATE%.log', // 错误日志文件名模式 datePattern: 'YYYY-MM-DD', // 日期格式 zippedArchive: true, // 归档旧日志文件时压缩 maxSize: '20m', // 文件最大大小 maxFiles: '14d', // 保留最近14天的日志文件 level: 'error' // 设置此传输的最低日志级别为 error }) ] }); // 导出日志函数 module.exports = { info: (message) => logger.info(message), warn: (message) => logger.warn(message), error: (message) => logger.error(message) };