在 Linux 下对 Node.js 日志进行切割,常见做法有 应用层切割、系统工具切割(logrotate)、进程管理工具切割(PM2) 等。下面按使用频率和推荐程度说明。
适合: 所有 Node.js 服务(无论用什么启动)
which logrotate
假设日志路径:
/var/log/node/app.log
新建配置文件:
sudo vim /etc/logrotate.d/node-app
示例配置:
/var/log/node/app.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
}
daily:每天切割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 直接截断日志(重要)sudo logrotate -f /etc/logrotate.d/node-app
✅ 优点
PM2 自带日志管理。
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
~/.pm2/logs/
✅ 优点
适合需要精确控制或使用自定义 logger。
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',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 优点
forever -o out.log -e err.log app.js
配合 logrotate 使用。
| 场景 | 推荐方案 |
|---|---|
| 生产服务器 | ✅ logrotate |
| PM2 启动 | ✅ pm2-logrotate |
| 微服务/容器 | winston 切割 |
| Docker | 挂载卷 + logrotate |
❌ Node.js 写文件后日志不更新
✅ 使用 copytruncate
❌ 日志无限增长
✅ 设置 maxFiles / rotate
❌ Docker 内日志爆炸
✅ 限制 stdout + 外部 logrotate
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。