Bash脚本实现日志管理和ping操作自动化

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

使用bash写一个脚本,生成日志文件,保存在logs/文件夹下。 设置日志留存天数的变量,文件名由log_日期_文件编号构成。再设置4个变量ping间隔、连续ping次数、丢包率、网口名称,每3秒ping一次192.168.3.1,连续ping3次,如果丢包率大于50%,则通过指令route -n检查是否有169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0这一行,如果没有则发送指令 route add -net 169.254.0.1 dev 网口名称,打印ping失败。延迟200毫秒后继续循环。 程序开始运行时, 1、获取最新的日志文件编号,如果没有当天的日志则生成一个。 2、如果有则顺延编号生成新的日志文件。 3、每个生成的日志文件大小不大于1M。如果写入新日志时,文件超过1M则顺延编号生成新的日志文件。 4、设置一个日志留存日期的变量,默认为3天,日志文件名格式为”log_20240606_1”、“log_20240606_2”、“log_20240607_1”,删除指定日期及以前的日志。

回答:

以下是一个符合你要求的Bash脚本。这个脚本会生成日志文件,保存在logs/文件夹下,并根据指定的条件进行ping操作和日志管理。

#!/bin/bash

# 设置变量
LOG_DIR="logs"
LOG_RETENTION_DAYS=3
PING_INTERVAL=3
PING_COUNT=3
LOSS_THRESHOLD=50
INTERFACE_NAME="wlan0"
TARGET_IP="192.168.3.1"
ROUTE_CHECK="169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 $INTERFACE_NAME"
ROUTE_ADD="route add -net 169.254.0.1 dev $INTERFACE_NAME"
MAX_LOG_SIZE=1048576  # 1MB in bytes

# 创建日志目录
mkdir -p $LOG_DIR

# 获取当前日期
current_date=$(date +%Y%m%d)

# 获取最新的日志文件编号
get_latest_log_number() {
    local latest_log=$(ls $LOG_DIR/log_${current_date}_* 2>/dev/null | sort -V | tail -n 1)
    if [[ -z $latest_log ]]; then
        echo 1
    else
        local latest_number=$(echo $latest_log | awk -F'_' '{print $3}')
        echo $((latest_number + 1))
    fi
}

# 删除过期日志
delete_old_logs() {
    find $LOG_DIR -type f -name "log_*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;
}

# 记录日志
log_message() {
    local message=$1
    local log_file=$2
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> $log_file
}

# 主循环
while true; do
    # 获取最新的日志文件编号
    log_number=$(get_latest_log_number)
    log_file="$LOG_DIR/log_${current_date}_${log_number}"

    # 如果日志文件不存在,创建新的日志文件
    if [[ ! -f $log_file ]]; then
        touch $log_file
    fi

    # 检查日志文件大小,如果超过1MB,创建新的日志文件
    if [[ $(stat -c%s "$log_file") -ge $MAX_LOG_SIZE ]]; then
        log_number=$((log_number + 1))
        log_file="$LOG_DIR/log_${current_date}_${log_number}"
        touch $log_file
    fi

    # 执行ping操作
    ping_result=$(ping -c $PING_COUNT $TARGET_IP)
    packet_loss=$(echo "$ping_result" | grep -oP '\d+(?=% packet loss)')

    if [[ $packet_loss -gt $LOSS_THRESHOLD ]]; then
        route_check_result=$(route -n | grep "$ROUTE_CHECK")
        if [[ -z $route_check_result ]]; then
            $ROUTE_ADD
        fi
        log_message "Ping failed with $packet_loss% packet loss." $log_file
    else
        log_message "Ping successful with $packet_loss% packet loss." $log_file
    fi

    # 删除过期日志
    delete_old_logs

    # 等待指定的时间间隔
    sleep $PING_INTERVAL
done

说明:

  1. 日志目录和变量设置:脚本开始时设置了日志目录、日志保留天数、ping间隔、ping次数、丢包率阈值、网口名称等变量。
  2. 创建日志目录:使用mkdir -p命令确保日志目录存在。
  3. 获取最新的日志文件编号:通过get_latest_log_number函数获取最新的日志文件编号,如果没有当天的日志文件则从1开始。
  4. 删除过期日志:通过delete_old_logs函数删除超过保留天数的日志文件。
  5. 记录日志:通过log_message函数记录日志信息。
  6. 主循环:在主循环中执行ping操作,检查丢包率并根据条件添加路由,记录日志信息,并检查日志文件大小,超过1MB则创建新的日志文件。最后,删除过期日志并等待指定的时间间隔。

使用方法:

  1. 将脚本保存为ping_log.sh
  2. 赋予脚本执行权限:chmod +x ping_log.sh
  3. 运行脚本:./ping_log.sh

请根据实际情况调整变量值和路径。