在 Node.js 项目运行于 Linux 环境下时,**日志滚动(Log Rotation)**通常有几种常见做法。下面按「推荐程度」给你讲清楚。
logrotate(生产环境首选)原理:Node.js 只管往文件里写日志,logrotate 负责定期切割、压缩、清理。
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天滚动rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 就能滚动日志(非常重要)✅ 适合 pm2、forever、systemd 启动的 Node 服务
如果你不想依赖系统工具,可以在 Node 里自己控制。
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({
filename: '/var/log/myapp/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello log');
✅ 自动按天切割
✅ 自动压缩
✅ 不依赖 Linux
PM2 默认会生成日志,但不会自动清理。
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
如果你是:
systemctl start myapp
日志在:
/var/log/myapp/app.log
✅ 直接用 方案一 logrotate + copytruncate 即可
❌ 手动 fs.rename
| 场景 | 推荐方案 |
|---|---|
| 生产服务器 | logrotate |
| 容器 / PaaS | winston-daily-rotate-file |
| PM2 项目 | pm2-logrotate |
| 简单脚本 | 直接写文件 + logrotate |
如果你愿意,可以告诉我:
我可以给你一套可直接用的配置。