Bash脚本生成日志文件并管理ping操作和路由设置

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

使用bash写一个脚本,生成日志文件,保存在logs/文件夹下。 设置日志留存天数的变量,文件名由log_日期_文件编号构成。再设置5个变量ping间隔、连续ping次数、丢包率、网口名称、ping超时,每3秒ping一次192.168.3.1,连续ping3次,ping时间超过1500毫秒则判定为丢包,如果丢包率大于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
PING_TIMEOUT=1500
INTERFACE_NAME="wlan0"
PING_ADDRESS="192.168.3.1"
LOG_FILE_SIZE_LIMIT=1048576  # 1MB in bytes

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

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

# 获取最新的日志文件编号
get_latest_log_file_number() {
    local latest_file=$(ls $LOG_DIR/log_${current_date}_* 2>/dev/null | sort -t_ -k3 -n | tail -n 1)
    if [[ -z $latest_file ]]; then
        echo 0
    else
        echo $(basename $latest_file | awk -F_ '{print $3}')
    fi
}

# 生成新的日志文件
generate_new_log_file() {
    local file_number=$(($(get_latest_log_file_number) + 1))
    echo "${LOG_DIR}/log_${current_date}_${file_number}"
}

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

# 检查并添加路由
check_and_add_route() {
    if ! route -n | grep -q "169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 $INTERFACE_NAME"; then
        route add -net 169.254.0.1 dev $INTERFACE_NAME
        echo "Route added for $INTERFACE_NAME"
    fi
}

# 初始化日志文件
log_file=$(generate_new_log_file)

# 主循环
while true; do
    # 检查日志文件大小
    if [[ -f $log_file && $(stat -c%s "$log_file") -ge $LOG_FILE_SIZE_LIMIT ]]; then
        log_file=$(generate_new_log_file)
    fi

    # 执行ping操作
    ping_result=$(ping -c $PING_COUNT -W $PING_TIMEOUT $PING_ADDRESS)
    packet_loss=$(echo "$ping_result" | grep -oP '\d+(?=% packet loss)')
    max_time=$(echo "$ping_result" | grep -oP '\d+(?= ms)' | sort -n | tail -n 1)

    # 记录日志
    echo "$(date +'%Y-%m-%d %H:%M:%S') - Ping result: $ping_result" >> $log_file

    # 检查丢包率和最大ping时间
    if [[ $packet_loss -gt 50 || $max_time -gt $PING_TIMEOUT ]]; then
        check_and_add_route
        echo "$(date +'%Y-%m-%d %H:%M:%S') - Ping failed. Packet loss: $packet_loss%, Max time: ${max_time}ms" >> $log_file
    fi

    # 延迟200毫秒
    sleep 0.2

    # 等待下一个ping间隔
    sleep $PING_INTERVAL
done

# 删除过期日志
delete_old_logs

说明:

  1. 日志目录和文件管理

    • 脚本会在logs/目录下生成日志文件,文件名格式为log_日期_编号
    • 每次运行时会检查当前日期的最新日志文件编号,并生成新的日志文件。
    • 如果日志文件大小超过1MB,则生成��的日志文件。
  2. ping操作

    • 每3秒ping一次目标地址192.168.3.1,连续ping3次。
    • 如果ping时间超过1500毫秒或丢包率大于50%,则检查并添加路由。
  3. 日志留存管理

    • 脚本会删除超过设定留存天数(默认3天)的日志文件。
  4. 延迟和循环

    • 每次ping操作后延迟200毫秒,然后继续循环。

请根据实际需求调整脚本中的变量值。运行脚本时,请确保有足够的权限执行route命令。