Golang 日志在 CentOS 的备份策略
策略总览
- 在 CentOS 上,推荐以“轮转 + 压缩 + 保留策略”为主,配合“异地/离线归档”与“应用内归档”形成多层防护。
- 优先使用系统自带的 logrotate 做按天/按大小的滚动与压缩,避免日志无限增长并便于保留管理;对关键日志再增加 定时拷贝/压缩 到备份目录或对象存储;若应用直接写文件,可在代码中引入 lumberjack 等库实现按大小滚动与保留。这样既能满足日常运维,又能降低单点故障风险。
方案一 系统级 logrotate 轮转与压缩(首选)
- 适用场景:Golang 应用通过文件输出日志(如写入 /var/log/myapp.log),使用 nohup 或 systemd 启动均可。
- 配置步骤:
- 创建应用专属配置
sudo nano /etc/logrotate.d/myapp
- 写入策略示例(按天轮转、保留 7 天、压缩、自动创建新文件)
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 640 root adm
}
- 若应用不支持文件句柄重新打开(仅简单重定向输出),可用 copytruncate 避免重启
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
- 手动测试并验证
sudo logrotate -f /etc/logrotate.d/myapp
ls -lh /var/log/myapp*
- 说明:logrotate 通常由 /etc/cron.daily/logrotate 每日触发,无需额外 cron;copytruncate 适合无法发送 SIGHUP 的场景,但存在极小概率丢日志的风险,优先选择能响应信号的应用或配合优雅重启。
方案二 定时拷贝压缩备份到备份目录(补充)
- 适用场景:需要在轮转之外再做一份离线/异地归档,或日志分散在多个目录。
- 实施要点:
- 创建备份脚本 /usr/local/bin/backup_logs.sh
#!/bin/bash
set -e
LOG=“/var/log/myapp.log”
BACKUP_DIR=“/var/log/myapp_logs_backup/$(date +%F)”
mkdir -p “$BACKUP_DIR”
ts=$(date +“%Y-%m-%d_%H-%M-%S”)
cp “$LOG” “$BACKUP_DIR/app_$ts.log”
gzip “$BACKUP_DIR/app_$ts.log”
- 赋权并加入 cron(每天 01:00 执行)
chmod +x /usr/local/bin/backup_logs.sh
crontab -e
0 1 * * * /usr/local/bin/backup_logs.sh
- 提示:可在脚本中加入 rsync 同步到备份服务器,或将压缩包上传到对象存储,实现更稳妥的灾备。
方案三 应用内归档与系统日志集成(可选增强)
- 应用内归档:使用 lumberjack 让 Go 程序自行滚动与保留,便于容器/短生命周期进程
import (
“log”
“github.com/natefinch/lumberjack”
)
logger := log.New(&lumberjack.Logger{
Filename: “/var/log/myapp.log”,
MaxSize: 10, // MB
MaxBackups: 3, // 保留个数
MaxAge: 28, // 保留天数
Compress: true, // 压缩
})
- 系统日志集成:将日志发送到 rsyslog/syslog-ng,由系统统一轮转与归档
- 示例(写入本地 syslog):
syslog, _ := os.Open(“/dev/log”)
logger := log.New(syslog, "myapp: ", log.LstdFlags)
logger.Println(“hello”)
- 如需网络日志,可在 /etc/rsyslog.conf 启用 imudp/imtcp 模块并重启 rsyslog 服务。
保留周期与命名规范建议
- 保留周期:按合规与容量规划设置,常见为 7/30/90 天;对调试期可适当缩短,生产环境建议不少于 7 天。
- 命名规范:统一使用时间戳与压缩后缀,便于排序与清理,例如 app_2025-11-27_01-00-00.log.gz。
- 权限与目录:日志目录建议 root:adm,权限 750/640;备份目录可独立分区,避免影响业务磁盘。
- 容量预警:为日志分区设置 磁盘告警阈值(如 80%),并定期审计轮转与备份是否成功执行。