示例说明
单个日志文件无限增长会耗尽磁盘、拖慢检索。DailyRotateFile 传输器按日期切分文件,同时 maxSize 设定单文件体积上限,任一条件触发即切换新文件。maxFiles 支持天数或文件数形式,配合 zippedArchive 自动压缩历史文件,把磁盘占用约束在可预算范围内。
技术要点
- datePattern 决定切分粒度与文件命名
- maxSize 与日期双条件触发轮转
- error 级别独立传输器便于分级保留
代码解读
主传输器按天切分并保留 30 天,auditFile 记录轮转审计信息防止误删;错误传输器保留 90 天满足事故回溯合规要求。format 链先把时间戳与错误堆栈合并进日志行再输出 JSON,保证错误对象可被结构化检索。
使用建议
容器化部署优先输出到 stdout 由平台收集,文件轮转适用于虚拟机与物理机场景。audit 文件本身也应纳入监控。轮转期间句柄释放依赖传输器内部队列,不要在 fork 的子进程里复用同一 logger。
代码示例
import winston from 'winston';
import 'winston-daily-rotate-file';
const transport = new winston.transports.DailyRotateFile({
dirname: 'logs',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '50m',
maxFiles: '30d',
zippedArchive: true,
auditFile: 'logs/audit.json',
level: 'info',
});
const errorTransport = new winston.transports.DailyRotateFile({
dirname: 'logs',
filename: 'error-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '90d',
zippedArchive: true,
level: 'error',
});
export const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json(),
),
transports: [transport, errorTransport],
});
logger.info('rotation policy active');
logger.error('payment webhook failed', { attempt: 3 });