在 Debian 上给 Node.js 日志做轮转(log rotation),常见有几种方式,从“最推荐”到“可选”如下:
logrotate(最推荐 ✅)Debian 默认已安装 logrotate,适合 文件日志(如 app.log)。
const fs = require('fs');
const log = fs.createWriteStream('/var/log/nodeapp/app.log', { flags: 'a' });
sudo nano /etc/logrotate.d/nodeapp
内容示例:
/var/log/nodeapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
copytruncate:对 Node.js 非常重要
daily / weekly:轮转周期rotate 14:保留 14 份compress:压缩旧日志sudo logrotate -d /etc/logrotate.d/nodeapp
sudo logrotate -f /etc/logrotate.d/nodeapp
适合 不想用 logrotate 或 容器环境。
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({
filename: '/var/log/nodeapp/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 自动按天轮转
✅ 自动压缩
✅ 不需要 logrotate
pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
✅ 适合 PM2 管理的 Node 服务
❌ 不适合裸 node 启动
如果是 Docker:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
| 场景 | 推荐方案 |
|---|---|
| 服务器裸跑 Node | logrotate + copytruncate |
| 容器 / 微服务 | winston-daily-rotate-file |
| PM2 | pm2-logrotate |
| Docker | Docker logging driver |
如果你愿意,可以告诉我:
我可以给你一份完全贴合你环境的配置。