#!/usr/bin/env bash # 带大小限制的日志复制函数 copy_log_with_limit() { local src="$1" local dest="$2" local size_limit_mb="$3" if [ ! -f "$src" ]; then echo "日志文件不存在: $src" > "$dest" return 1 fi # 检查文件权限 if [ ! -r "$src" ]; then echo "无权限读取日志文件: $src" > "$dest" return 1 fi # 获取文件大小(MB) local file_size file_size=$(du -m "$src" 2>/dev/null | cut -f1 || echo 0) if [ "$file_size" -gt "$size_limit_mb" ]; then log_warning "跳过大文件: $src (${file_size}MB > ${size_limit_mb}MB)" echo "[日志文件超过大小限制未采集 - ${file_size}MB > ${size_limit_mb}MB]" > "$dest" return 2 fi # 复制文件,保留原始权限 if cp "$src" "$dest" 2>/dev/null; then log "成功复制日志: $src -> $dest (${file_size}MB)" return 0 else echo "复制日志文件失败: $src" > "$dest" return 1 fi } # 收集特定应用的日志 collect_app_logs() { local app_name="$1" local log_patterns=( "/var/log/${app_name}/*.log" "/var/log/${app_name}.log" "/opt/${app_name}/logs/*.log" ) local app_log_dir="${OUTPUT_DIR}/app_logs" mkdir -p "$app_log_dir" for pattern in "${log_patterns[@]}"; do for log_file in $pattern; do if [ -f "$log_file" ]; then local base_name=$(basename "$log_file") copy_log_with_limit "$log_file" "${app_log_dir}/${app_name}_${base_name}" "$LOG_SIZE_LIMIT" fi done done } # 收集系统日志 collect_logs() { log "收集系统日志(最近${LOG_AGE}小时,大小限制: ${LOG_SIZE_LIMIT}MB)..." local syslog_dir="${OUTPUT_DIR}/logs" mkdir -p "$syslog_dir" # 常见的系统日志文件 local system_logs=( "/var/log/syslog" "/var/log/messages" "/var/log/kern.log" "/var/log/dmesg" "/var/log/boot.log" ) # 收集标准系统日志文件 for log_file in "${system_logs[@]}"; do if [ -f "$log_file" ]; then local base_name=$(basename "$log_file") copy_log_with_limit "$log_file" "${syslog_dir}/${base_name}" "$LOG_SIZE_LIMIT" fi done # 使用journalctl作为后备方案 if [ ! -f "${syslog_dir}/syslog" ] && [ ! -f "${syslog_dir}/messages" ]; then log "使用journalctl收集系统日志..." if command -v journalctl >/dev/null 2>&1; then if journalctl --since "${LOG_AGE} hours ago" > "${syslog_dir}/journalctl.log" 2>/dev/null; then log_success "journalctl日志收集成功" else log_warning "journalctl日志收集失败" echo "无法获取journalctl日志" > "${syslog_dir}/journalctl.log" fi else log_warning "journalctl命令不存在" echo "journalctl命令不可用" > "${syslog_dir}/journalctl.log" fi fi # 收集dmesg日志 log "收集dmesg日志..." if command -v dmesg >/dev/null 2>&1; then if dmesg -T > "${syslog_dir}/dmesg.log" 2>&1; then log_success "dmesg日志收集成功" else # 如果-T选项不支持,使用普通dmesg dmesg > "${syslog_dir}/dmesg.log" 2>&1 || { log_warning "dmesg日志收集失败" echo "无法获取dmesg日志" > "${syslog_dir}/dmesg.log" } fi else log_warning "dmesg命令不存在" echo "dmesg命令不可用" > "${syslog_dir}/dmesg.log" fi # 收集应用日志(DCU相关) collect_app_logs "dcu" collect_app_logs "hydcu" collect_app_logs "nvidia" # 兼容性考虑 # 收集其他有用的日志 local other_logs=( "/var/log/secure" "/var/log/auth.log" "/var/log/yum.log" "/var/log/apt/history.log" ) for log_file in "${other_logs[@]}"; do if [ -f "$log_file" ]; then local base_name=$(basename "$log_file") copy_log_with_limit "$log_file" "${syslog_dir}/${base_name}" "$LOG_SIZE_LIMIT" fi done log_success "系统日志收集完成" }