今有需求:需要监控每隔五分钟检测一次日志文件是否出自按某个关键字。利用过滤全部的日志信息 虽然可以过滤出来关键字告警,但是修复后,依然还是会报警,存在局限性,所以需要使用以下办法来实现需求。

本想循环获取5分钟内的时间戳,然后从日志文件中grep这个时间端的信息,然后再获取关键字,但是通过查看日志文件发现时间戳与主机时间不同步,所以,这种方法不可取。
那么怎么获取最近五分钟的日志信息,再过滤关键字呢?思索了很久,又有了新思路。
将现在的文件日志重定向到一个新的文件里面

cat /var/log/xxx >  /root/logs/tmp.txt9  //执行此命令,因为第一次需要手动执行,后续循环不需要再执行

然后写一个监控脚本(此脚本是被监控主机监控项的命令,五分钟获取一次信息,即五分钟执行一次脚本)

#!/bin/sh
LOG_FILE=/var/log/xxx
KEY_WORDS="guanjianzi"
if [ ! -s /var/log/xxx ];then //判断文件是否为空,为空则输出为0;不为空,则执行下一步
echo "0"
else 
  A=$(awk '{print NR}' /root/logs/tmp.txt9 | tail -n1) //统计将日志重定向的到此文件的行数
  B=$(awk '{print NR}' /var/log/xxx | tail -n1) //统计日志的行数(此时已经比重定向里面的文件多了五分钟的信息)

  C=$( echo $B - $A |bc)  //获取日志文件最新五分钟的行数
  tail -n $C /var/log/xxx> /root/logs/tet9  //查看最近五分钟的信息并写入一个新的文件

  cat  /root/logs/tet9 | grep "$KEY_WORDS" >txt9 //在最近五分钟的文件中过滤某个关键字,将输出结果写入一个新的文件
  if [ -s txt9 ]; then  //判断这个文件是否为空,不为空则输出1 ;为空,则输出为0
    echo "1"
  else
   echo "0"
 fi
fi
        cat /var/log/xxx  > /root/logs/tmp.txt9  //将此事的日志信息重定向到该文件当中去

然后五分钟后又会执行此脚本,如此循环。