在 Ubuntu 上,Node.js 日志分割常见有 3 种成熟方案,按推荐程度从低到高说明,并给出可直接用的配置示例。
pm2 自带日志分割(最常用 ✅)如果你用 pm2 管理 Node.js 进程,强烈推荐直接用 pm2-logrotate。
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD
含义:
max_size:单个日志最大 10MBretain:保留最近 7 个日志compress:压缩旧日志dateFormat:日志文件名带日期默认在:
~/.pm2/logs/
✅ 优点
logrotate(适合所有 Node 服务)适合 不用 pm2 或希望系统统一管理日志。
sudo vim /etc/logrotate.d/node-app
/var/log/node/app.log {
daily
rotate 7
size 50M
missingok
notifempty
compress
delaycompress
copytruncate
}
| 参数 | 说明 |
|---|---|
| daily | 每天切割 |
| rotate 7 | 保留 7 份 |
| size 50M | 超过 50M 也切 |
| copytruncate | 不重启 Node 也能切 |
| compress | gzip 压缩 |
sudo logrotate -d /etc/logrotate.d/node-app
✅ 优点
⚠️ 注意:
copytruncate 在极端高并发下可能有极少量日志丢失
winston + winston-daily-rotate-filenpm 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: '10m',
maxFiles: '7d'
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello node log');
✅ 适合
❌ 缺点
| 场景 | 推荐方案 |
|---|---|
| pm2 管理 Node | ✅ pm2-logrotate |
| 系统服务 / systemd | ✅ logrotate |
| Docker 容器 | winston-daily-rotate |
| 简单脚本 | logrotate |
✅ Node.js 只管打日志
✅ 日志切割 交给 pm2 或系统
✅ 日志目录统一:
/var/log/node/
如果你愿意,可以告诉我:
我可以帮你 直接生成一份可用配置。