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

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

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

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

#!/bin/bash
##收件人的邮箱
[email protected]
##为防止按小时或者按天切割的日志错过获取机会,将系统时间设置一个前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
##收件人的邮箱
[email protected]
[email protected]
##为防止按小时或者按天切割的日志错过获取机会,将系统时间设置一个前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



你可能感兴趣的:(shell)