zoukankan      html  css  js  c++  java
  • 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"=====================
    "}' >>/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
     
  • 相关阅读:
    第五周总结
    第四周总结
    关于“模仿"和”创新“
    第三周总结
    第九周总结
    第八周总结
    第六周总结
    中国历史上成功的两人合作
    第五周总结
    第四周总结
  • 原文地址:https://www.cnblogs.com/cheerjude/p/10491137.html
Copyright © 2011-2022 走看看