通过日志判断系统是否正常运行

当前已经引入了自动化部署,但是由于能力有限和其他限制,目前只是通过监控端口是否存在来判断程序
正常启动与否。常常jenkins上返回服务部署成功,用户访问时却失败,只能靠人手动登录系统查看日志进行判断,反应不灵敏, 且jenkins已下放于各级开发人员操作
这引发了诸多不便和难以管理。因此,增加了启动日志关键字判断脚本, 当部署应用程序时,会主动触发脚本进行关键字过滤,达到退出条件时返回并发送提示信息。

目前收集到的关键字,主要由以下:

            ^Caused by
            ^at
            Error
            Exception

废话不多说,直接上脚本了。

#!/bin/bash

APP=$(cd `dirname $0`;pwd)

#判断应用程序是jar还是tomcat
FILETYPE=`ls *.jar &>/dev/null | wc -l`
if [ ${FILETYPE} -eq 0 ];then
    LOGFILE=${APP}/logs/catalina.out
else
    LOGFILE=`ls ${APP}/*.log`
fi

#告警条件
WARN=0
#当前读取的行数
LAST=1
#当前环境所包含的地址有限,故使用简单的正则收集
MANAGERIP=`ip a | grep -E '192.168.15.|192.168.100.' | awk '{print $2}'`

#`which tail` -fn 220 ${LOGFILE} | awk '/^Caused by|^    at |Error|Exception/{print }' 
while true
do
    total_line=`wc -l $LOGFILE | awk '{print $1}'`
    line=`head -n $LAST ${LOGFILE} | tail -1`
    num=$(echo $line | awk '/^Caused by|^at |Error|Exception/{ print}' | wc -l)
    LAST=$(( LAST + 1 ))
    WARN=$(( WARN + num ))

    #退出条件的处理
    if [ ${LAST} -gt 1000 ];then
        break
    fi
    if [ ${WARN} -gt 10 ];then
        break
    fi
    if [ ${LAST} -eq 150 ];then
        sleep 1
    fi
    if [ ${LAST} -eq ${total_line} ];then
        if [ `echo $line | awk '/success/{print}'| wc -l` -ne 0 ];then
            break
        else
            if [ ${LAST} -lt 300 ];then
                continue
            fi
        fi
    fi
done
if [ ${WARN} -gt 9 ];then
    MESSAGE="路径:${APP}, 管理地址: ${MANAGERIP}, 启动出现错误,请登录系统查看"
else
    MESSAGE="路径:${APP}, 管理地址: ${MANAGERIP}, 启动成功"
fi

#此处触发消息发送
curl -X POST -H "'Content-type':'application/x-www-form-urlencoded', 'charset':'utf-8','Accept':'text/plain'" -d "${MESSAGE}" http://192.168.15.212:9000/alarm

echo "success finished"

以上,只是对日志中过滤关键字判断进行了简单的处理,且个人能力有限,未做深入探索。
后记更新(2018-07-20)
在对目前测试环境进行迁移后,发现前面脚本存在bug, 主要是由于

  1. 查看日志流过快,应用启动较慢,导致日志还未输出到系统中,脚本就已退出
  2. 脚本的退出标识为计数,可能会存在很长时间未能达到要求,而使自动化部署卡住。
  3. 增加了成功启动的退出标识
    因此,对于脚本进行了二次改版,改版后的应用,不再使用计数,若不存在退出标识,则会在超时30秒后退出成功
    
    #!/bin/bash

APP=$(cd dirname $0;pwd)
FILETYPE=ls ${APP}/*.jar 2>/dev/null | wc -l
if [ ${FILETYPE} -eq 0 ];then
LOGFILE=${APP}/logs/catalina.out
else
LOGFILE=ls ${APP}/*.log
fi

WARN=0
LAST=1
EXIT_TIME=0
MANAGERIP=ip a | grep -E '192.168.15.|192.168.100.' | awk '{print $2}'

#which tail -fn 220 ${LOGFILE} | awk '/^Caused by|^ at |Error|Exception/{print }'
while true
do

total_line=`wc -l ${LOGFILE} | awk '{print $1}'`
line=`head -n $LAST ${LOGFILE} | tail -1`
num=$(echo $line | awk '/^Caused by|^at |Error |Exception /{ print}' | wc -l)
echo $LAST $WARN, $line
if [ `echo $line | awk '/success|sussess|Server startup/{print}'| wc -l` -ne 0 ];then
    break
fi
if [ ${EXIT_TIME} -gt 30 ];then
    break
fi
if [ ${total_line} -lt ${LAST} ];then
    sleep 1
    EXIT_TIME=$(( EXIT_TIME + 1 ))
    continue
fi
LAST=$(( LAST + 1 ))
WARN=$(( WARN + num ))
if [ ${WARN} -gt 10 ];then
    break
fi
done

echo ${WARN}
if [ ${WARN} -gt 9 ];then
MESSAGE="路径:${APP}, 管理地址: ${MANAGERIP}, 启动出现错误,请登录系统查看"
else
MESSAGE="路径:${APP}, 管理地址: ${MANAGERIP}, 启动成功"
fi

curl -X POST -H "'Content-type':'application/x-www-form-urlencoded', 'charset':'utf-8','Accept':'text/plain'" -d "${MESSAGE}" http://192.168.15.212:9000/alarm
echo "success finished"

转载于:https://blog.51cto.com/zhenfen/2147318

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值