← 中文资源

简体中文版本

Winston 按日轮转日志传输

用 winston-daily-rotate-file 按日期与体积双重轮转日志:压缩归档、保留天数上限,错误流独立成文件便于排障。

阅读英文原文

示例说明

单个日志文件无限增长会耗尽磁盘、拖慢检索。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 });