|
#!/bin/bash
######################################################
#by:亚信同事
# 日志关键字 isClosed:true 在10分钟内连续出现则 1级告警
# 监控当前日志:/app/aichannel/uds/tomcat/logs/catalina.outYYYYMMDD
# YYYYMMDD表示当天如catalina.out20160126
# 如下10分钟内没有连续isClosed:true 则不告警
# 否则:如有超过10分钟连续出现isClosed:true 时检查最后一次出现isClosed:true行的上下文(上下2000行)
# 上下文中如果同时含有“收到响应包”、“rspcode:0”的行则不告警,否则告警
######################################################
# data 保存数据文件,记录上次的行号 last_num
# 若上次产生告警,则记录至最后一个 isClosed:false 的下一行
# 否则,记录第一个 isClosed:false 的下一行
######################################################
DEBUG="false"
if [ $DEBUG = "true" ];then
orig_dir="."
else
orig_dir="${HOME}/scrcoldispoy/DEM_BOMC_AA_20160129_113050067"
fi
cd $orig_dir
declare -A para
while read key value
do
para[$key]=$value
done < ./data
tok=DEM_BOMC_AA_20160129_113050067.tok
###############################################################################
# 日志文件,大于20M时压缩半数行
log="alpha.log"
if [ -e $log ];then
log_size=`ls -l $log | awk '{printf("%d",$5)}'`
if [ -n "$log_size" -a $log_size -gt 20971520 ];then
half_line=`awk 'END{printf("%d",NR/2)}' $log`
perl -ni -e "print if(\$.>$half_line)" $log
fi
fi
###############################################################################
# 写日志
wlog() {
[ "$DEBUG" = "true" ] && debug_str='[DEBUG]' || debug_str=''
echo "`date +%Y-%m-%d' '%H:%M:%S`:$debug_str $*" >> $log
}
###############################################################################
# 顺序取出行,与上一行比较,相同则继续比较下一行
# 否则计算最后不同的行与第一行的时间差
compare_lines() {
dest_file=$1
num=`echo ${para[last_num]}`
wlog "从第${num}行开始查询"
if [ -e $dest_file ];then
wlog "采集指令:grep -n -a 'isClosed' $dest_file | sed -n '/$num:ERROR/,\$p'"
lines=`grep -n -a 'isClosed' $dest_file | sed -n "/$num:ERROR/,\\\$p"`
fi
[ -z "$lines" ] && return
top_line=''
cur_line=''
bottom_line=''
while read line
do
bottom_line=$line
last_str=`echo $line | awk -F: '{print $NF}' | tr A-Z a-z`
# 找到首次出现true的行
if [ -z "$top_line" -a "$last_str" = "true" ];then
top_line=$line
fi
if [ "$last_str" = "true" -o -z "$top_line" -o -z "$cur_line" ];then
cur_line=$line
continue
else
diff_time "$top_line" "$cur_line"
# 相差小于10分钟,开始新一轮判断
if [ $? -eq 0 ];then
top_line=''
cur_line=''
else
# 相差大于10分钟,保存当前行
para[top_num]=`echo $top_line | awk -F: '{x=$1?$1:1;print x}'`
top_line=$cur_line
para[execeed_10min]=1
break
fi
fi
done $tok
wlog "data配置文件内容:"
:>data
for key in ${!para[@]}
do
echo "$key ${para[$key]}" >> data
wlog "$key ${para[$key]}"
done
[ "$DEBUG" = "false" ] && mv $tok ${HOME}/perfsrcfils/proc
wlog ">>> 采集结束 |
|
|
|
|
|
|