如何在最后几分钟内获取具有特定字符串值的所有日志

时间:2016-08-30 06:53:30

标签: shell date awk

我有一个使用自己的日志文件格式的应用程序。现在我希望在一定时间内获得具有某些字符串值的所有日志行,例如“致命错误”。日志数据格式如下:

Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: abcd efddf 
Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd 
Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error 
Thread-28689296: Thu Aug 25 15:19:41 2016 [ info ]: dfdfdfd

如果“now”是2016年8月25日15:19:41,我想在15:19:41和15:17:41之间找到那些在我的日志文件中出现“致命错误”的行。因此,当前时间应该是从日期开始,x分钟前应该是从“日期x分钟前”,以便从应用程序日志中找到某些错误消息。

如果我使用以下命令行:

  awk -v Date="$(date "+%b %d %H:%M:%S %Y")" -v Date2="$(date -- date="2 
  minutes ago" "+%b %d %H:%M:%S %Y")" '$5 > Date && $5 < Date2' log_file | 
  grep "Fatal error"

条件中的变量“$ 5”实际上在我的示例日志数据中得到分钟“17”和“19”的值,但它与日期值进行比较。所以这不起作用。

如何在$ 3到$ 7字段的日志时间戳中构造时间值,以比较当前时间的值。我对shell脚本不熟悉。

提前感谢您的建议和帮助。

2 个答案:

答案 0 :(得分:0)

Gnu AWK中的一个:

$ cat > check.awk 
BEGIN {
    start=mktime("2016 8 25 15 19 00") # desired start time. If now, use something like:
    # end=strftime("%s"); start=end-120
    end=mktime("2016 8 25 15 19 12")   # end time for this example
    # make text months into numbers:
    split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mons,",")
    for(i in mons)
        mons[mons[i]]=i
}
{
    atime=mktime($6" "mons[$3]" "$4" "gensub(/:/," ","g",$5)) # your log time format
} 
atime<end && atime>start # && add your desired error messages here
$ awk -f check.awk yer.log
Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd
Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error

答案 1 :(得分:0)

你可以试试这个:

#!/bin/sh

  Date="$(date "+%b %d %H:%M:%S %Y")"
  Date2="$(date --date="2 minutes ago" "+%b %d %H:%M:%S %Y")"

  first_line=$(grep -n "$Date2" log_file | awk -F ":" '{print $1}')

  last_line=$(grep -n "$Date" log_file | awk -F ":" '{print $1}')

  sed -n "${first_line},${last_line}p" log_file | grep "Fatal error"
相关问题