在 Debian 上,“JS 日志”通常指 Node.js 应用产生的日志。日志分割(rotate)最常用、最稳妥的方式是 配合 Linux 自带的 logrotate,而不是在 JS 代码里自己处理。下面按常见场景给你一套可落地的做法。
dpkg -l logrotate
如果没有:
sudo apt update
sudo apt install logrotate
假设你用类似方式写日志:
const fs = require('fs');
fs.writeFileSync('/var/log/myapp/app.log', 'hello\n', { flag: 'a' });
或者 PM2:
pm2 logs
sudo nano /etc/logrotate.d/myapp
示例(✅ 强烈推荐):
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
dateext
dateformat -%Y%m%d
}
| 参数 | 作用 |
|---|---|
daily |
每天分割 |
rotate 7 |
保留 7 份 |
compress |
压缩旧日志 |
delaycompress |
延迟压缩(兼容 Node) |
copytruncate |
✅ 不重启进程,直接截断文件 |
dateext |
日期命名 |
生成文件示例:
app.log
app.log-20260121.gz
app.log-20260120.gz
sudo logrotate -d /etc/logrotate.d/myapp
-d 是 debug,不真正执行。
强制执行:
sudo logrotate -f /etc/logrotate.d/myapp
如果你用 PM2:
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 优点:
⚠️ 缺点:
如果是 Docker:
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=5 \
node-app
或 syslog / journald
❌ 不建议在容器里再跑 logrotate
原因:
除非你用的是 Winston + Daily Rotate File:
npm install winston-daily-rotate-file
const transport = new DailyRotateFile({
dirname: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '7d'
});
✅ 适合小项目
❌ 不适合生产高并发
如果是 systemd 启动的 Node 服务:
journalctl -u myapp -f
日志由 systemd 管理,不需要额外分割。
| 场景 | 推荐 |
|---|---|
| 普通 Node 服务 | ✅ logrotate |
| PM2 | ✅ pm2-logrotate |
| Docker | ✅ docker log driver |
| 小工具 | winston-daily-rotate |
如果你愿意,可以把你的 Node 启动方式(PM2 / systemd / Docker)和日志路径发出来,我可以直接帮你写一份 可用的 logrotate 配置。