怎样用脚本自动备份Apache日志?

wen 实用脚本 2

本文目录导读:

怎样用脚本自动备份Apache日志?

  1. 方法一:Shell脚本备份(最常用)
  2. 方法二:使用logrotate(推荐系统级方案)
  3. 方法三:Python脚本(更灵活)
  4. 方法四:远程备份脚本
  5. 设置定时任务
  6. 使用建议

我来详细说明如何用脚本自动备份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

使用建议

  1. 测试环境验证:先在测试环境运行脚本
  2. 日志文件权限:确保脚本有读取权限
  3. 磁盘空间监控:定期检查备份目录大小
  4. 错误通知:添加邮件或短信通知功能
  5. 备份验证:定期测试备份文件的完整性

选择哪种方法取决于你的具体需求,对于一般场景使用Shell脚本配合crontab即可。

抱歉,评论功能暂时关闭!