在 Debian 上给 Node.js 日志做分割,常见且推荐的做法有 3 种,从简单到规范依次是:
logrotate(最推荐,Debian 官方方式)适合场景:Node.js 直接写文件日志(如 winston、pino 输出到文件)
dpkg -l | grep logrotate
# 没有就装
sudo apt install logrotate
假设你的 Node.js 日志路径是:
/var/log/myapp/app.log
新建配置:
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
dateext
}
| 参数 | 作用 |
|---|---|
| daily | 每天分割 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启 Node.js 也能生效 |
| dateext | 日志带日期 |
sudo logrotate -d /etc/logrotate.d/myapp
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: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '7d'
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 优点:不依赖系统
❌ 缺点:无法压缩、不能统一管理系统日志
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 服务
❌ 不适合 systemd / Docker
| 场景 | 推荐 |
|---|---|
| 系统级 | ✅ logrotate |
| PM2 | ✅ pm2-logrotate |
| 容器 | ✅ stdout + 外部日志驱动 |
❌ 不要 Node.js 和 logrotate 同时写同一个文件
❌ 不要用 kill -HUP 除非你自己在处理信号
✅ 优先用 copytruncate
Node 服务:
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
logrotate 如上配置即可。
如果你愿意,可以告诉我:
我可以给你 完全定制的配置 ✅