在 Debian 上给 Node.js 日志做轮转(log rotation),最常用、最推荐的方式是结合 logrotate(系统自带)或者使用 Node.js 自身日志库。下面分几种常见情况说明。
例如:
/var/log/myapp/app.log
新建文件:
sudo nano /etc/logrotate.d/myapp
示例配置:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 node node
sharedscripts
postrotate
# 让 Node.js 重新打开日志文件(关键)
pkill -USR1 -f "node /path/to/app.js"
endscript
}
daily:每天轮转(也可 weekly / size 50M)rotate 14:保留 14 份compress:压缩旧日志pkill -USR1:
sudo logrotate -d /etc/logrotate.d/myapp # 测试(不实际执行)
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
如果你用 PM2 启动 Node.js:
~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log
pm2 install pm2-logrotate
常用配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
✅ 不需要 logrotate
✅ 自动处理文件句柄
如果你自己写日志(如 fs.appendFile):
setInterval(() => {
process.kill(process.pid, 'SIGUSR1');
}, 86400000);
⚠️ 容易出错,一般配合 logrotate 使用
npm install winston winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
dirname: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
})
]
});
✅ 不需要系统 logrotate
✅ 适合容器 / PaaS
| 场景 | 推荐方式 |
|---|---|
| 服务器长期运行 | logrotate |
| PM2 管理 | pm2-logrotate |
| Docker / 容器 | winston-daily-rotate-file |
| 简单脚本 | logrotate |
如果你愿意,可以告诉我:
我可以直接帮你写一份可用的配置。