在 Ubuntu 上为 Node.js 日志做备份,常见做法取决于日志的存储方式(文件、stdout、容器、PM2 等)。下面按最常见场景给你一套完整、可落地的方案。
fs.appendFileSync('app.log', log)
winstonpinobunyan适合:
sudo apt install logrotate
sudo nano /etc/logrotate.d/node-app
示例配置:
/var/log/node/app.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 node node
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天轮转 |
| rotate 30 | 保留 30 天 |
| compress | gzip 压缩 |
| copytruncate | 不中断 Node 写文件 |
| missingok | 文件不存在不报错 |
✅ 不需要重启 Node.js
~/.pm2/logs/
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
✅ 自动轮转、压缩、删除
tar -czf node-logs-$(date +%F).tar.gz /var/log/node
可加入 crontab:
crontab -e
0 2 * * * tar -czf /backup/node-logs-$(date +\%F).tar.gz /var/log/node
docker logsdocker logs <container> > app.log
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3
const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: '/var/log/node',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '30d'
});
const logger = createLogger({
transports: [transport]
});
✅ 自动按天备份
✅ 不需要 logrotate
| 级别 | 建议 |
|---|---|
| 本地 | logrotate / pm2-logrotate |
| 远程 | 定期 scp / rsync 到备份服务器 |
| 云 | 上传到 OSS / S3 |
| 监控 | 日志 + 监控(Prometheus / Grafana) |
| 场景 | 推荐方案 |
|---|---|
| 普通 Node 服务 | logrotate |
| PM2 | pm2-logrotate |
| Docker | json-file + log-opt |
| 高可控 | winston + daily rotate |
如果你愿意,可以告诉我:
我可以 直接给你一份可用的配置文件 ✅