16. 分析Tomcat日志

如果你公司服务器上跑的是java的代码,那多半会使用tomcat,而tomcat出现问题我们就需要去查看tomcat的日志。tomcat有一个日志叫做catalina.out,它记录了tomcat相关的信息,包括正确的和错误的。该案例的需求背景是这样的:

服务器上跑着4个tomcat实例,目录结构如下:

/opt/TOMCAT/crontabs
/opt/TOMCAT/t1
/opt/TOMCAT/t2
/opt/TOMCAT/t3
/opt/TOMCAT/t4

而catalina.out所在路径如下:

/opt/TOMCAT/t1/logs/catalina.out
/opt/TOMCAT/t2/logs/catalina.out
/opt/TOMCAT/t3/logs/catalina.out
/opt/TOMCAT/t4/logs/catalina.out

具体需求如下:

1)脚本可以取Tomcat实例t1-t4的日志,通过参数指定是哪一个;

2)脚本可以自定义取日志的起始位置和结束位置,比如取今天早上10点之后到现在的日志,要求提供的时间为24小时制;

3)第一个参数为哪一个tomcat(t1、t2、t3、t4),第二个参数为起始时间点(只考虑当天的时间),第三个参数为结束时间点,可省略,若忽略则为当前时间点;

4)提供的时间点需要判断是否符合要求,即必须为17:10:04这样的格式。

日志片段如下:

Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"]
Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-bio-8080"]
Oct 29, 2018 01:52:24 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 2102 ms

参考脚本如下:

#!/bin/bash
#截取指定Tomcat的日志片段

LANG=en
logfile="/opt/TOMCAT/$1/logs/catalina.out"

d_mdy=`date "+%b %d,%Y"`

if [ $# -ne 2 ] && [ $# -ne 3 ]
then
    echo "你提供的参数个数不对,请提供2个或者3个参数。例如,sh $0 t1 08:01:00 10:51:30"
    exit 1
fi

if ! echo $1 |grep -qE '^t1$|^t2$|^t3$|^t4$'
then
    echo "第一个参数必须是t1、t2、t3或t4"
    exit 1
fi

judge_time()
{
    date -d "$1" +%s &>/dev/null
    if [ $? -ne 0 ]
    then
        echo "你提供的时间$1格式不正确"
        exit 1
    fi
}

judge_time_in_log()
{
    if ! grep -q "$d_mdy $(tr_24_12 $1)" $logfile
    then
        echo "你提供的时间$1在日志$logfile中没有出现,请更换时间点"
        exit 1
    fi
}

tr_24_12()          #将24小时制转换为12小时制
{
    date -d "$1" +%r
}

judge_time $2

judge_time_in_log $2

if [ $# -eq 3 ]
then
    judge_time $3
    
    t1=`date -d "$2" +%s`
    t2=`date -d "$3" +%s`
    if [ $t2 -lt $t1 ]
    then
        echo "你提供的时间$2$3晚,应该把早的时间放在前面"
        exit 1
    fi
    
    judge_time_in_log $3
fi

#取起始时间所在行行号
begin_n=`grep -n "$d_mdy $(tr_24_12 $2)" $logfile |head -1 |awk -F ':' '{print $1}'`

if [ $# -eq 3 ]
then
    #取结束时间所在行行号
    n=`grep -n "$d_mdy $(tr_24_12 $3)" $logfile |tail -1 |awk -F ':' '{print $1}'`
    
    #结束时间所在行的下一行为日志内容,用sed截取
    end_n=$[$n+1]
    sed -n "$begin_n,$end_n"p $logfile
else
    sed -n "$begin_n,$"p $logfile           #截取从起始位置到最后位置的日志内容
fi

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值