您的位置:首页 > 运维架构 > Shell

新写了一个简单的日志监控shell脚本(之前的问题已经修复)

2017-12-28 11:11 656 查看
测试了一下 还是蛮好用的,语法比较入门 比较基础,改改路径 和过滤的关键字就能用了,相信很多刚开始学脚本的 都是能看得懂的.

注:发送邮件的服务器最好配置一下mailx这个功能,方便邮件正常发送。或者你有其他的配置方式。

突然发现存在BUG  现在还在更改中,需要一点时间。

#!/bin/bash
##收件人的邮箱
MAIL_USER=xxxxxxx@163.com
##为防止按小时或者按天切割的日志错过获取机会,将系统时间设置一个前5秒的变量,这样00:00时间要做的操作是获取前一天的日志,就不会出错了。
OUT_NAME=`date -d "-5 sec" +%F_%H`
##日志名称加入时间变量
CATALINA_NAME=catalina-${OUT_NAME}.out
##tomcat的日志放在这里
CATALINA_DIR=/home/admin/tomcat/logs/${CATALINA_NAME}
##截取日志的关键字
ERROR="ERROR"
##截取后的日志存放在这
ERR_LOG=/home/admin/ERROR.log
HOST=${HOSTNAME}
##截取的时间范围数字  单位分钟
DATE=10
##获取当前时间变量
NEW_TIME=`date +%F\ %H:%M`
##获取之前的时间,根据上面的时间范围数字的变量来调整获取的时间段。
OLD_TIME=`date -d "-${DATE} min" +%F\ %H:%M`
##提取和过滤日志
TAIL_LOG (){
if [ -f ${CATALINA_DIR} ]
then
##初次过滤日志并判断
sed -n "/${OLD_TIME}/,/${NEW_TIME}/p" ${CATALINA_DIR} |grep -A5 -B2 "${ERROR}" >${ERR_LOG}
sleep 30
if [ -s ${ERR_LOG} ]
then
Email
else
##如果日志未能获取到则进入循环
NUM=0
while :
do
NUM=$[${NUM} + 1]
DATE=$[${DATE} + 1]
OLD_TIME=`date -d "-${DATE} min" +%F\ %H:%M`
sed -n "/${OLD_TIME}/,/${NEW_TIME}/p" ${CATALINA_DIR} |grep -A5 -B2 "${ERROR}" >${ERR_LOG}
if [ -s ${ERR_LOG} ]
then
Email
break
else
###判断循环是否满3次且同时未获取到日志,则退出
if [ ${NUM} -ge 3 ]
then
echo "${OLD_TIME} 范围3分钟左右没有日志生成,请注意是否未输出日志。" | mail -s "日志异常" ${MAIL_USER}
break
else
continue
fi
fi
done
fi
fi
}
###发送邮件
Email (){
mail -s "${HOST} a ERROR_log" ${MAIL_USER} <${ERR_LOG}
}
TAIL_LOG


更改后的脚本,将循环判断的方式更改了,上面的不删除了,或许有其他人也用得到。

#!/bin/bash
##收件人的邮箱
MAIL_USER=xxxx@163.com
MAIL_USER2=xxxx@163.com
##为防止按小时或者按天切割的日志错过获取机会,将系统时间设置一个前5秒的变量,这样00:00时间要做的操作是获取前一天的日志,就不会出错了。
OUT_NAME=`date -d "-5 sec" +%F_%H`
##日志名称加入时间变量
CATALINA_NAME=catalina-${OUT_NAME}.out
##tomcat的日志放在这里
CATALINA_DIR=/home/admin/tomcat/logs/${CATALINA_NAME}
##截取日志的关键字
ERROR="ERROR"
##截取后的日志存放在这
ERR_LOG=/home/admin/ERROR.log
ERROR_LOG=/home/admin/ERROR.log2
HOST=${HOSTNAME}
##截取的时间范围数字  单位分钟
DATE=10
##获取当前时间变量
NEW_TIME=`date +%F\ %H:%M`
##获取之前的时间,根据上面的时间范围数字的变量来调整获取的时间段。
OLD_TIME=`date -d "-${DATE} min" +%F\ %H:%M`
##提取和过滤日志
TAIL_LOG (){
if [ -f ${CATALINA_DIR} ]
then
sed -n "/${OLD_TIME}/,/${NEW_TIME}/p" ${CATALINA_DIR} >${ERR_LOG}
sleep 30
if [ -s ${ERR_LOG} ]
then
GREP_LOG
else
NUM=0
while :
do
NUM=$[${NUM} + 1]
DATE=$[${DATE} - 1]
OLD_TIME=`date -d "-${DATE} min" +%F\ %H:%M`
sed -n "/${OLD_TIME}/,/${NEW_TIME}/p" ${CATALINA_DIR} >${ERR_LOG}
if [ -s ${ERR_LOG} ]
then
GREP_LOG
break
else
###判断循环是否满3次且同时未获取到日志,则退出
if [ ${NUM} -ge 3 ]
then
echo "${OLD_TIME} 范围3分钟左右没有日志生成,请注意是否未输出日志。" | mail -s "日志异常" ${MAIL_USER}
break
else
continue
fi
fi
done
fi
fi
}

GREP_LOG (){
if [ -s ${ERR_LOG} ]
then
grep -A5 -B2 "${ERROR}" ${ERR_LOG} >${ERROR_LOG}
if [ -s ${ERROR_LOG} ]
then
sleep 3
Email
fi
fi
}
###发送邮件
Email (){
NUMBER=`grep "ERROR" ${ERROR_LOG}|wc -l`
mail -s "${HOST} a ERROR_log The number of ${NUMBER}" ${MAIL_USER} <${ERROR_LOG}
mail -s "${HOST} a ERROR_log The number of ${NUMBER}" ${MAIL_USER2} <${ERROR_LOG}
}
TAIL_LOG
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: