在 Debian 上,Node.js 本身不负责日志轮转(log rotation),通常由 系统工具 来完成。最常见、推荐的做法是使用 logrotate。下面按常见场景给你一套完整方案。
logrotate(最推荐 ✅)dpkg -l | grep logrotate
如果没有:
sudo apt update
sudo apt install logrotate
假设你的 Node.js 日志路径:
/var/log/myapp/app.log
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}
说明:
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 7 |
保留 7 份 |
compress |
压缩旧日志 |
delaycompress |
延迟压缩 |
missingok |
日志不存在不报错 |
notifempty |
空日志不轮转 |
create |
创建新日志文件 |
copytruncate |
✅ 关键:不重启 Node.js |
sudo logrotate -d /etc/logrotate.d/myapp
(-d 是 debug 模式,不会真正执行)
真正执行:
sudo logrotate -f /etc/logrotate.d/myapp
const fs = require('fs');
const stream = fs.createWriteStream('/var/log/myapp/app.log', { flags: 'a' });
stream.write('hello\n');
配合 logrotate + copytruncate 即可。
pm2 logs
日志默认在:
~/.pm2/logs/
pm2 install pm2-logrotate
常用配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ PM2 用户首选方案
| 方式 | 原因 |
|---|---|
| Node.js 里自己切日志 | 容易出错、复杂 |
| 删除正在写入的日志 | 磁盘不释放 |
| 不重启应用切日志 | 必须用 copytruncate |
原因:
解决:
sudo lsof | grep deleted
✅ 使用 copytruncate 或重启进程
| 场景 | 推荐 |
|---|---|
| 原生 Node.js | logrotate + copytruncate |
| PM2 | pm2-logrotate |
| Docker | 宿主机 logrotate / Docker log driver |
如果你愿意,可以告诉我:
我可以直接帮你写一份 可用的 logrotate 配置。