以下是CentOS系统中Golang日志的备份策略及实现方法:
使用logrus或zap等库结合lumberjack实现日志自动切割与备份,适合程序级控制。
import (
"go.uber.org/zap"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := zap.New(zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
&lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 日志路径
MaxSize: 10, // 单文件最大大小(MB)
MaxBackups: 7, // 保留历史文件数
MaxAge: 30, // 保留天数
Compress: true, // 是否压缩
},
zap.InfoLevel,
))
defer logger.Sync()
logger.Info("日志记录示例")
}
优势:程序自动管理日志文件,无需额外定时任务,支持按大小或时间切割。通过shell脚本+cron实现定期全量备份,适合简单场景。
backup_logs.sh:#!/bin/bash
LOG_FILE="/path/to/app.log"
BACKUP_DIR="/path/to/backup"
mkdir -p "$BACKUP_DIR"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
cp "$LOG_FILE" "${BACKUP_DIR}/app_${DATE}.log"
gzip "${BACKUP_DIR}/app_${DATE}.log" # 可选压缩
cron任务(每天凌晨1点执行):crontab -e
# 添加以下内容
0 1 * * * /path/to/backup_logs.sh
logrotate(适合系统级管理)利用Linux自带工具实现日志轮转、压缩和删除,适合生产环境。
/etc/logrotate.d/myapp:/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志
missingok # 忽略缺失文件
notifempty # 非空文件才轮转
create 640 root root # 新日志文件权限
}
logrotate -f /etc/logrotate.conf
使用rsync将日志实时同步到远程服务器,适合分布式或高可用场景。
rsync -avz --delete /path/to/app.log user@remote_host:/path/to/backup/
cron定时执行(如每5分钟同步一次):*/5 * * * * rsync -avz --delete /path/to/app.log user@remote_host:/path/to/backup/
inotify-tools监控日志文件变化,异常时触发告警。根据实际需求选择策略,优先使用程序库内置功能(如Lumberjack)或系统工具(logrotate),平衡灵活性与管理成本。