本文目录导读:

我来详细说明如何用脚本自动备份Apache日志,以下是几种常用方法:
Shell脚本备份(最常用)
基础备份脚本
#!/bin/bash
# 配置变量
LOG_DIR="/var/log/apache2" # 根据实际路径修改
BACKUP_DIR="/backup/apache_logs"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
LOG_FILES=("access.log" "error.log")
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份日志文件
for log_file in "${LOG_FILES[@]}"; do
if [ -f "$LOG_DIR/$log_file" ]; then
# 复制并压缩
cp "$LOG_DIR/$log_file" "$BACKUP_DIR/${log_file}_$DATE"
gzip "$BACKUP_DIR/${log_file}_$DATE"
# 清空原始日志(不删除文件)
> "$LOG_DIR/$log_file"
fi
done
# 删除旧备份
find $BACKUP_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
# 记录日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 日志备份完成" >> /var/log/backup_apache.log
带有日志轮转的脚本
#!/bin/bash
# 配置
LOG_DIR="/var/log/apache2"
BACKUP_DIR="/backup/apache_logs"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="apache_logs_$DATE.tar.gz"
# 临时目录
TEMP_DIR="/tmp/apache_backup_$$"
# 清理函数
cleanup() {
rm -rf $TEMP_DIR
rm -f /tmp/log_files_$$
}
# 错误处理
trap cleanup EXIT
# 创建目录
mkdir -p $BACKUP_DIR $TEMP_DIR
# 复制日志文件到临时目录
cp $LOG_DIR/*.log $TEMP_DIR/ 2>/dev/null
# 打包压缩
cd $TEMP_DIR
tar -czf "$BACKUP_DIR/$BACKUP_FILE" *.log
# 清空原始日志
for log_file in $TEMP_DIR/*.log; do
filename=$(basename "$log_file")
> "$LOG_DIR/$filename"
done
# 设置权限
chmod 640 $BACKUP_DIR/$BACKUP_FILE
# 清理旧备份(保留30天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
# 记录备份信息
echo "$DATE - 备份文件: $BACKUP_FILE (大小: $(du -h $BACKUP_DIR/$BACKUP_FILE | cut -f1))" >> /var/log/backup_apache.log
使用logrotate(推荐系统级方案)
配置logrotate
创建配置文件 /etc/logrotate.d/apache-backup:
/var/log/apache2/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 root adm
sharedscripts
postrotate
if [ -f /var/run/apache2/apache2.pid ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript
dateext
dateformat -%Y%m%d
}
手动执行logrotate
# 测试配置 sudo logrotate -d /etc/logrotate.d/apache-backup # 强制执行 sudo logrotate -f /etc/logrotate.d/apache-backup
Python脚本(更灵活)
#!/usr/bin/env python3
import os
import shutil
import gzip
import datetime
import logging
from pathlib import Path
# 配置
LOG_DIR = "/var/log/apache2"
BACKUP_DIR = "/backup/apache_logs"
RETENTION_DAYS = 30
LOG_FILES = ["access.log", "error.log"]
# 设置日志
logging.basicConfig(
filename='/var/log/apache_backup.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def backup_apache_logs():
"""备份Apache日志"""
try:
# 创建备份目录
os.makedirs(BACKUP_DIR, exist_ok=True)
# 生成时间戳
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
# 备份每个日志文件
for log_file in LOG_FILES:
source_path = os.path.join(LOG_DIR, log_file)
if not os.path.exists(source_path):
logging.warning(f"日志文件不存在: {source_path}")
continue
# 创建备份文件名
backup_name = f"{log_file}_{timestamp}.gz"
backup_path = os.path.join(BACKUP_DIR, backup_name)
# 压缩并备份
with open(source_path, 'rb') as f_in:
with gzip.open(backup_path, 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
# 清空原始日志
open(source_path, 'w').close()
logging.info(f"已备份: {log_file} -> {backup_name}")
# 清理旧备份
cleanup_old_backups()
except Exception as e:
logging.error(f"备份失败: {str(e)}")
def cleanup_old_backups():
"""清理过期备份"""
cutoff_date = datetime.datetime.now() - datetime.timedelta(days=RETENTION_DAYS)
for backup_file in Path(BACKUP_DIR).glob("*.gz"):
file_mtime = datetime.datetime.fromtimestamp(backup_file.stat().st_mtime)
if file_mtime < cutoff_date:
backup_file.unlink()
logging.info(f"已删除旧备份: {backup_file.name}")
if __name__ == "__main__":
backup_apache_logs()
远程备份脚本
#!/bin/bash
# 配置
LOG_DIR="/var/log/apache2"
REMOTE_USER="backup_user"
REMOTE_HOST="backup.example.com"
REMOTE_DIR="/backup/apache_logs"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="apache_logs_$DATE.tar.gz"
# 创建临时目录
TEMP_DIR=$(mktemp -d)
# 复制日志
cp $LOG_DIR/*.log $TEMP_DIR/
# 压缩
cd $TEMP_DIR
tar -czf /tmp/$BACKUP_FILE *.log
# 远程传输
scp /tmp/$BACKUP_FILE ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/
# 清空日志
for log_file in $LOG_DIR/*.log; do
> "$log_file"
done
# 清理临时文件
rm -rf $TEMP_DIR /tmp/$BACKUP_FILE
echo "$(date) - 远程备份完成" >> /var/log/apache_backup.log
设置定时任务
添加到crontab
# 编辑crontab crontab -e # 添加以下行(每天凌晨2点执行) 0 2 * * * /path/to/backup_script.sh # 或者使用系统定时器(systemd) sudo systemctl enable apache-backup.timer
systemd定时器配置
创建 /etc/systemd/system/apache-backup.service:
[Unit] Description=Apache Log Backup Service [Service] Type=oneshot ExecStart=/usr/local/bin/backup_apache_logs.sh User=root
创建 /etc/systemd/system/apache-backup.timer:
[Unit] Description=Run Apache backup daily [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target
使用建议
- 测试环境验证:先在测试环境运行脚本
- 日志文件权限:确保脚本有读取权限
- 磁盘空间监控:定期检查备份目录大小
- 错误通知:添加邮件或短信通知功能
- 备份验证:定期测试备份文件的完整性
选择哪种方法取决于你的具体需求,对于一般场景使用Shell脚本配合crontab即可。