在 Ubuntu 上,Node.js 本身不会自动做日志轮转(log rotation),通常需要借助系统工具或 Node 生态里的库来实现。下面按常见做法从简单到生产级给你讲清楚。
logrotate(生产环境标准做法)app.log)logrotate 按天 / 大小切割、压缩、删除旧日志创建配置文件:
sudo nano /etc/logrotate.d/node-app
内容示例:
/var/log/node-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 14 |
保留 14 份 |
compress |
压缩旧日志 |
copytruncate |
不重启 Node,直接截断日志(很重要) |
✅ copytruncate 是 Node 应用最常用方式
sudo logrotate -d /etc/logrotate.d/node-app
winston + winston-daily-rotate-filenpm install winston winston-daily-rotate-file
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: '/var/log/node-app/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 适合:
❌ 缺点:
如果你用 PM2:
pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
✅ PM2 会自动处理 stdout / stderr 日志
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
Docker 自己管理日志轮转
| 场景 | 推荐方案 |
|---|---|
| 服务器直接运行 Node | ✅ logrotate |
| Docker | docker logging |
| PM2 | pm2-logrotate |
| 不想动系统 | winston daily rotate |
如果你愿意,可以告诉我:
我可以直接帮你写一份可用的配置文件。