在 Linux 上备份 Node.js 日志,常见做法取决于日志的存储方式(文件、stdout、systemd、Docker 等)。下面按最常用场景给你完整方案,从简单到规范。
/var/log/myapp/app.logcp /var/log/myapp/app.log /backup/app-$(date +%F).log
或压缩:
tar czf app-$(date +%F).tar.gz /var/log/myapp/
crontab -e
每天凌晨 2 点备份:
0 2 * * * tar czf /backup/node-app-$(date +\%F).tar.gz /var/log/myapp/
%在 cron 中需要转义
不要只备份,要轮转,否则日志会无限变大。
logrotate(生产环境首选)sudo vim /etc/logrotate.d/node-app
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
dateext
}
| 参数 | 作用 |
|---|---|
| daily | 每天轮转 |
| rotate 14 | 保留 14 天 |
| compress | gzip 压缩 |
| copytruncate | 不重启 Node.js |
| dateext | 按日期命名 |
✅ 适合 Node.js 写文件日志
~/.pm2/logs/
tar czf pm2-logs-$(date +%F).tar.gz ~/.pm2/logs/
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
journalctl -u myapp.service
journalctl -u myapp.service > myapp-$(date +%F).log
或导出为 json:
journalctl -u myapp.service -o json > myapp.json
docker logs my_container > app.log 2>&1
或定时:
docker logs my_container 2>&1 | gzip > app-$(date +%F).log.gz
docker run -v /host/logs:/app/logs node-app
然后按「文件备份」处理。
const winston = require('winston');
const { combine, timestamp, json } = winston.format;
const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: 'app.log' })
]
});
✅ 配合 logrotate
| 场景 | 推荐方案 |
|---|---|
| 单机 Node.js | 文件日志 + logrotate |
| PM2 | PM2 + pm2-logrotate |
| systemd | journalctl + logrotate |
| Docker | stdout + 宿主机 logrotate |
| 高并发 | Pino + 文件 + logrotate |
❌ 直接 rm 日志
❌ 不轮转导致磁盘爆满
❌ 备份时 Node.js 正在写文件(用 copytruncate)
你可以告诉我:
我可以直接给你可用的配置文件。