温馨提示×

Nodejs日志如何按天切割

小樊
61
2026-07-18 20:08:59
栏目: 编程语言

在 Node.js 中,日志按天切割(日志轮转)常见有几种成熟方案,推荐优先使用现成库,而不是自己手动写文件重命名逻辑。


✅ 推荐方案一:winston + winston-daily-rotate-file(最常用)

安装

npm install winston winston-daily-rotate-file

示例

const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  dirname: 'logs',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',           // 单个文件最大
  maxFiles: '14d',          // 保留 14 天
  zippedArchive: true       // 是否压缩旧日志
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    transport,
    new winston.transports.Console()
  ]
});

logger.info('hello world');

生成效果

logs/
├── app-2026-01-20.log
├── app-2026-01-21.log

优点

  • 自动按天切割
  • 支持大小限制、过期删除、压缩
  • 工业级方案,生产常用

✅ 推荐方案二:pino + pino-roll(高性能)

适合高并发、IO 敏感场景。

安装

npm install pino pino-roll

示例

const pino = require('pino');
const roll = require('pino-roll');

const stream = roll({
  file: 'logs/app.log',
  frequency: 'daily',
  size: '10m',
  mkdir: true
});

const logger = pino({
  level: 'info'
}, stream);

logger.info('hello pino');

优点

  • 性能极高
  • 配置简单
  • 适合微服务 / 高 QPS

✅ 方案三:PM2 + 日志切割(适合部署环境)

如果你用 PM2 管理 Node 进程:

安装

pm2 install pm2-logrotate

配置

pm2 set pm2-logrotate:dateFormat YYYY-MM-DD
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

优点

  • 不侵入代码
  • 适合服务器部署
  • 自动切割 pm2 logs

❌ 不推荐方案:自己写 fs.rename

// 不推荐
fs.renameSync('app.log', `app-${today}.log`);

❌ 问题:

  • 会丢日志
  • 多进程不安全
  • 无法处理文件大小、压缩、并发

✅ 方案对比总结

场景 推荐方案
通用 Node 项目 winston + daily-rotate-file
高性能 / 微服务 pino + pino-roll
服务器部署 PM2 + pm2-logrotate
简单脚本 pino

✅ 最佳实践建议

  • 日志目录不要放在项目根目录
  • 天 + 大小 双重限制
  • 生产环境建议 JSON 格式(方便 ELK)
  • 不要长期保留本地日志

如果你告诉我:

  • ✅ 是否使用 PM2
  • ✅ 是否高并发
  • ✅ 是否对接 Docker / K8s / ELK

我可以帮你直接给出最合适的配置方案

0