Node.js 日志轮转策略主要是通过配置日志库来实现日志文件的自动切割、压缩和归档。常见的日志库如 Winston 和 Pino 都提供了日志轮转的功能。以下是使用 Winston 库实现日志轮转策略的示例:
- 安装 Winston 库:
npm install winston
- 配置 Winston 日志轮转:
const winston = require('winston'); const { createLogger, format, transports } = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const transport = new DailyRotateFile({ filename: 'application-%DATE%.log', datePattern: 'YYYY-MM-DD-HH', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); const logger = createLogger({ transports: [transport] }); // 在开发环境下,还可以在控制台输出 if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); }
在这个配置中:
filename
参数指定了日志文件的名称,并使用日期模式%DATE%
来自动添加时间戳。zippedArchive
参数设置为true
,表示生成的旧日志文件会被压缩。maxSize
参数设置为20m
,表示每个日志文件的最大大小为 20MB。maxFiles
参数设置为14d
,表示保留 14 天的日志文件。
通过上述配置,Winston 会自动根据时间和文件大小对日志文件进行切割,并压缩旧文件,从而避免单个日志文件过大,确保日志管理的有效性。
此外,Node.js 的 fs
模块也可以通过配置来实现基本的日志轮转,例如使用 RotatingFileHandler
:
const logging = require('logging'); logging.configure({ appenders: { cheese: { type: 'dateFile', filename: 'logs/cheese', pattern: '-yyyy-MM-dd.log', alwaysIncludePattern: true, maxLogSize: 1024 * 12, } }, categories: { default: { appenders: ['cheese'], level: 'trace' } } }); const logger = logging.getLogger('cheese'); logger.info('这是一条信息日志');
在这个示例中,maxLogSize
参数设置每个日志文件的最大大小为 12KB,当日志文件达到指定大小时,新的日志将被创建,旧日志文件将被重命名并保留。
总之,通过合理配置日志库和日志轮转策略,可以有效地管理日志文件,确保系统性能和可维护性。