温馨提示×

linux nodejs日志怎么分割

小樊
40
2026-09-20 20:33:28
栏目: 编程语言

在 Linux 下对 Node.js 日志进行分割,常见做法有下面几种,从「最推荐」到「手动方案」依次说明。


一、最推荐:用日志库自带分割(代码层)

1. 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({
  filename: 'logs/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d'
});

const logger = winston.createLogger({
  transports: [transport]
});

logger.info('hello');

✅ 按天 / 大小自动分割
✅ 自动压缩、清理
✅ 不需要额外系统配置


2. pino + pino-rotate / rotatelog

npm install pino pino-rotate

适合高并发、性能优先场景。


二、使用 PM2 自带日志分割(生产常用)

如果你用 PM2 管理 Node 服务:

pm2 install pm2-logrotate

配置示例:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

✅ 零代码改动
✅ 适合已用 PM2 的项目


三、Linux 系统级:logrotate(通用方案)

适合 直接输出到文件 的 Node 服务。

1. 创建配置

sudo vim /etc/logrotate.d/node-app

内容示例:

/var/www/node-app/logs/*.log {
  daily
  missingok
  rotate 14
  compress
  delaycompress
  notifempty
  copytruncate
}

⚠️ 重点:

  • copytruncate:Node 不重开文件时也能生效
  • 否则需要信号通知 Node 重新打开日志

2. 手动测试

logrotate -d /etc/logrotate.d/node-app

四、自己写分割逻辑(不推荐)

适合极小项目:

  • 按时间 rename 文件
  • 或用 fs.watch / setInterval

缺点:容易写错、难维护


五、方案对比建议

场景 推荐方案
新项目 winston-daily-rotate-file
已用 PM2 pm2-logrotate
容器 / 云原生 stdout + 外部采集
老系统 logrotate

如果你愿意,可以告诉我:

  • ✅ 是否用 PM2
  • ✅ 日志现在是 console.log 还是写文件
  • ✅ 单日日志量大概多大

我可以直接给你一套可复制的配置。

0 踩