在 Linux 下,JS 应用的日志轮转通常有两种思路:
1)应用自己轮转(代码层)
2)系统级轮转(logrotate) ✅(最常用、最推荐)
下面按常见场景说明。
app.log)console.log 到终端(无法轮转)示例:
const fs = require('fs');
const logStream = fs.createWriteStream('/var/log/myapp/app.log', { flags: 'a' });
sudo vim /etc/logrotate.d/myapp
示例配置:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天轮转 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启进程,直接截断文件(Node 常用) |
| missingok | 日志不存在也不报错 |
sudo logrotate -d /etc/logrotate.d/myapp # 模拟
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
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: '7d',
zippedArchive: true
})
]
});
✅ 优点:不依赖系统
❌ 缺点:多进程需注意
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
| 场景 | 推荐方式 |
|---|---|
| 服务器部署 | ✅ logrotate |
| Node 单进程 | winston |
| PM2 | pm2-logrotate |
| Docker | docker logging |
如果你用的是 Node / PM2 / Docker / Nginx 反代,可以告诉我,我可以给你一份精确配置。