shell脚本提取服务器一段时间的日志并输出异常结果

功能描述

1、脚本截取服务器一个时间段内的日志tomcat.out,根据预先保存的异常关键词文件error_keyword.txt,提取日志中包含关键词的异常结果另存为文件(result+时间.txt);
2、脚本定时执行,每5分钟执行一次。

思路

1、执行get_Tomcatlog_Error脚本,读取time_cache.txt中记录的时间点,截取按该时间点到当前时间之间的日志内容,保存到临时文件log_temp.txt。
2、将NullPointerException等异常关键字放入error_keyword.txt文件中,把log_temp.txt包含这些关键字的内容,输出并另存到result文件夹中。
3、根据运维实际需要,后续可使用zabbix将结果发送,或者直接将结果邮件发送给相关人员。

脚本内容

 1 #!/bin/bash
 2 time_today=`date -d now "+%Y-%m-%d"`
 3 #取出当前时间作为读取结束时间
 4 time_endRead=`date -d now "+%H:%M:%S"`
 5 #取出时间加1秒
 6 time_startRead=`date -d "$(cat /data/shell/time_cache.txt) 1 second" "+%H:%M:%S"`
 7 #取出时间段内的日志
 8 #假如取出的时间是上一天的时间,可能比当前时间要大,做判断
 9 if [ `date -d "${time_startRead}" +%s` -gt `date -d "${time_endRead}" +%s` ]
10 then
11     awk 'BEGIN{RS="'"${time_today}"'"}$1>"00:00:00" && $1<"'"${time_endRead}"'"{printf("%s","NOTE-Tab:"$0)}' /usr/share/tomcat7/logs/tomcat.out >/data/shell/log_temp.txt
12 else
13     awk 'BEGIN{RS="'"${time_today}"'"}$1>"'"${time_startRead}"'" && $1<"'"${time_endRead}"'"{printf("%s","NOTE-Tab:"$0)}' /usr/share/tomcat7/logs/catalina-daemon.out >/data/shell/log_temp.txt
14 fi
15 #根据关键词遍历该时间段内日志,将结果输出
16 cat /data/keywords/error_keyword.txt|while read keyword
17 do 
18    cat /data/shell/log_temp.txt | awk 'BEGIN{RS="NOTE-Tab:"}/'"${keyword}"'/{print $0"=====================\n"}' >>/data/logs/icrm/error/errorResult_"${time_today}"_"${time_endRead}".txt
19 done
20 #把本次读取的最终时间写入到time_cache.txt文件,作为下次读取的起始时间
21 echo "${time_endRead}" > /data/shell/time_cache.txt

过程问题汇总

Q1、按时间段提取服务器日志时,选择sed还是awk?
time_startRead="07:49:36"
time_endRead=`date -d now "+%H:%M:%S"`
sed -n "/${time_startRead}/,/${time_endRead}/p" log.txt >test.txt
使用sed取俩个时间点时,俩个时间点必须均存在于日志中,否则取不到数据,所以建议用awk。
另外,如果使用sed截取时间段内服务器日志,引用时间变量时,不能用单引号只能用双引号,否则执行无效。参考: 
 
Q2、if判断俩个时间大小,使用大于号时,执行脚本后会自动生成空的时间文件
初步怀疑是执行脚本后, > 号不是作为判断,而是被执行为重定向输出。
因此,判断时间大小时,将时间转换为时间戳,再使用-gt进行判断,即
if [ `date -d "${time_startRead}" +%s` -gt `date -d "${time_endRead}" +%s` ]

 

Q3、awk输出行内容,使用printf,当行内容较大时报“fatal: not enough arguments to satisfy format string”
awk中使用printf时,要加%s,否则报如上错误,参考:https://blog.csdn.net/wireless_tech/article/details/6576861
 
posted @ 2019-03-07 17:49  牧羊神  阅读(5768)  评论(0编辑  收藏  举报