在 CentOS 上“备份 Golang 日志”通常取决于日志是怎么产生的(文件?stdout?系统 journal?),以及你想要的备份方式(手动 / 定时 / 远程)。下面按常见场景给你讲清楚。
比如你的 Go 程序:
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", ...))
那日志就在:
/var/log/myapp/app.log
如果是 systemd 启动的:
[Service]
ExecStart=/opt/myapp/app
日志在:
journalctl -u myapp
cp /var/log/myapp/app.log /backup/app_$(date +%F).log
tar zcvf /backup/app_$(date +%F).tar.gz /var/log/myapp/
crontab -e
添加:
0 0 * * * tar zcf /backup/app_$(date +\%F).tar.gz /var/log/myapp/
注意:
%在 crontab 里要转义
vi /etc/logrotate.d/myapp
示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate:不重启 Go 程序也能切日志rotate 7:保留 7 天测试:
logrotate -d /etc/logrotate.d/myapp
journalctl -u myapp > /backup/myapp_$(date +%F).log
journalctl -u myapp -o json > /backup/myapp.json
scp /backup/app_*.tar.gz backup@192.168.1.10:/data/backup/
rsync -avz /backup/ backup@server:/backup/
logruszapslog(Go 1.21+)并配合:
lumberjack)示例:
&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 7,
Compress: true,
}
最稳妥组合:
logrotate 自动切割crontab 定时压缩备份rsync 传到备份服务器如果你愿意,可以把:
发出来,我可以给你定制一份备份方案。