Debian下Golang日志的备份策略
策略总览
本地轮转与保留
使用系统工具 logrotate(推荐)
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
postrotate
# 可选:通知应用重新打开日志文件(按你的进程管理方式调整)
# systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
在应用内使用 lumberjack(内嵌轮转)
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // 单个文件最大 10MB
MaxBackups: 7, // 最多保留 7 个备份
MaxAge: 30, // 最多保留 30 天
Compress: true, // 启用压缩
})
远程备份与归档
0 2 * * * rsync -a --link-dest=/backup/logs/current /var/log/myapp/ /backup/logs/$(date -d "yesterday" +\%Y\%m\%d)/
&& rm -f /backup/logs/current
&& ln -s $(date -d "yesterday" +\%Y\%m\%d) /backup/logs/current
离线或冷备与监控
方式对比与选型建议
| 方式 | 适用场景 | 主要优点 | 注意点 |
|---|---|---|---|
| logrotate | 系统服务、物理机/虚拟机、容器主机 | 系统级统一、配置简单、与进程管理解耦 | 需确保应用支持“重新打开日志”(如信号或systemctl reload),定期做 dry-run 验证 |
| lumberjack | 容器、无 systemd、希望内嵌策略 | 部署简单、按大小滚动、参数可控 | 增加应用依赖;需合理设置 MaxSize/MaxBackups/MaxAge,避免频繁轮转影响性能 |
| rsyslog/syslog-ng | 统一接入系统日志、集中化采集 | 与系统日志体系集成、便于转发与过滤 | 需调整应用日志输出到 syslog,并规划中央存储与保留策略 |
| 说明:若已接入 rsyslog/syslog-ng,可将 Golang 日志输出到 stdout/stderr 或本地 syslog,由 rsyslog 负责写入文件、轮转与转发,便于集中管理与审计。 |