整体架构
- 实时读取日志:使用
tail -f
命令实时读取日志文件新增内容。
- 数据处理:对读取到的每一行日志按空格进行分割,提取事件类型。
- 统计计数:使用关联数组(Bash 4.0+)来统计不同事件类型在每分钟内出现的次数。
- 定时发送:使用
sleep
配合循环实现每分钟定时将统计结果发送到远程服务器接口。
关键技术点
- 实时读取日志:
tail -f
命令能实时追踪文件新增内容,保证日志数据的实时获取。
- 关联数组:Bash 4.0 引入的关联数组方便按事件类型作为键进行计数统计。
- JSON 格式化:使用工具如
jq
(需安装)或自行拼接 JSON 格式字符串,将统计结果格式化为符合远程接口要求的 JSON 数据。
- 网络请求:使用
curl
命令将 JSON 数据发送到远程服务器接口。
核心代码片段
#!/bin/bash
# 确保Bash版本支持关联数组(Bash 4.0+)
if ((BASH_VERSINFO[0] < 4)); then
echo "This script requires Bash 4.0 or higher"
exit 1
fi
# 日志文件路径
log_file="your_log_file.log"
# 远程服务器接口
api_url="http://your_remote_server/api"
# 初始化关联数组
declare -A event_count
while true; do
# 实时读取日志文件新增行
while IFS=' ' read -r timestamp event_type details; do
# 统计事件类型出现次数
((event_count[$event_type]++))
done < <(tail -n +1 -f $log_file | sed '1!G;h;$!d')
# 等待1分钟
sleep 60
# 构建JSON数据
json_data='{"event_counts": {'
first=true
for event in "${!event_count[@]}"; do
if $first; then
first=false
else
json_data+=","
fi
json_data+="\"$event\": ${event_count[$event]}"
done
json_data+="}}"
# 发送数据到远程服务器
curl -X POST -H "Content-Type: application/json" -d "$json_data" $api_url
# 重置关联数组
unset event_count
declare -A event_count
done