批量拿取多台服务器的日志文件
# 脚本如下
#!/bin/bash
# 脚本配置
SERVERS=("server1" "server2" "server3") # 服务器列表
KEYWORD="error" # 搜索关键字
LOG_PATH="/app/logs" # 日志路径
LOCAL_COLLECT_DIR="/data/log_collection" # 本地日志收集目录
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# 创建本地日志收集目录
mkdir -p $LOCAL_COLLECT_DIR/$TIMESTAMP
# 日志收集函数
collect_logs() {
local server=$1
# 远程搜索日志,使用更精确的查找方式
matched_logs=$(ssh $server "find $LOG_PATH -type f -print0 | xargs -0 grep -l '$KEYWORD'")
# 如果找到日志文件
if [ -n "$matched_logs" ]; then
# 创建临时目录
ssh $server "mkdir -p /tmp/log_collection"
# 使用数组存储日志文件
IFS=$'\n' read -d '' -r -a log_array <<< "$matched_logs"
# 复制所有匹配的日志文件到临时目录
for logfile in "${log_array[@]}"; do
ssh $server "cp '$logfile' /tmp/log_collection/"
done
# 压缩日志文件,确保所有文件都被包含
ssh $server "cd /tmp/log_collection && tar -czvf /tmp/log_collection_${server}.tar.gz ."
# 下载压缩文件
scp $server:/tmp/log_collection_${server}.tar.gz $LOCAL_COLLECT_DIR/$TIMESTAMP/
# 清理远程临时文件
ssh $server "rm -rf /tmp/log_collection /tmp/log_collection_${server}.tar.gz"
# 打印收集的日志文件
echo "Server $server collected logs:"
printf '%s\n' "${log_array[@]}"
else
echo "No logs found on server $server with keyword '$KEYWORD'"
fi
}
# 并行收集日志
for server in "${SERVERS[@]}"; do
collect_logs $server &
done
# 等待所有后台任务完成
wait
# 本地打包
tar -czvf $LOCAL_COLLECT_DIR/logs_collection_$TIMESTAMP.tar.gz -C $LOCAL_COLLECT_DIR $TIMESTAMP
echo "日志收集完成,位于 $LOCAL_COLLECT_DIR/logs_collection_$TIMESTAMP.tar.gz"
1
2
3
4
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 单个关键字执行
./collect_logs.sh
# 多个关键字可以这样修改
KEYWORDS=("error" "warning" "critical")
1
2
3
4
2
3
4


上次更新: 2025/04/21, 10:03:56