sys_log.sh 4.26 KB
Newer Older
liumg's avatar
liumg committed
1
#!/usr/bin/env bash
liumg's avatar
liumg committed
2
3
4

# 带大小限制的日志复制函数
copy_log_with_limit() {
liumg's avatar
liumg committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    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
liumg's avatar
liumg committed
34
    else
liumg's avatar
liumg committed
35
36
        echo "复制日志文件失败: $src" > "$dest"
        return 1
liumg's avatar
liumg committed
37
38
39
    fi
}

liumg's avatar
liumg committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 收集特定应用的日志
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
}
liumg's avatar
liumg committed
61
62
63

# 收集系统日志
collect_logs() {
liumg's avatar
liumg committed
64
    log "收集系统日志(最近${LOG_AGE}小时,大小限制: ${LOG_SIZE_LIMIT}MB)..."
liumg's avatar
liumg committed
65
    
liumg's avatar
liumg committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
    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
liumg's avatar
liumg committed
100
    fi
liumg's avatar
liumg committed
101
102
    
    # 收集dmesg日志
liumg's avatar
liumg committed
103
    log "收集dmesg日志..."
liumg's avatar
liumg committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    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 "系统日志收集完成"
liumg's avatar
liumg committed
140
}