在BASH中解析日志文件以查找特定时间戳之间的“错误”条目

时间:2011-08-15 19:41:35

标签: bash datetime logfiles

我在BASH中编写一个脚本,需要通过日志文件检查ERROR条目。我计划每小时运行一次,所以我只想让它只返回过去一小时内发生的ERROR类型条目(所有服务器时间都是GMT)。我建立了以下变量

# Log file directory
LOGPATH="/path/to/logs/"
# Current date and time
CURDATE=`date +%Y-%m-%d`
CURTIME=`date +%H:%M:%S`
# Old date and time
OLDDATE=`date +%Y-%m-%d -d "1 hour ago"`
OLDTIME=`date +%H:%M:%S -d "1 hour ago"`

所有日志文件都遵循文件名格式ktYEAR-MONTH-DAY.root.log.txt其中YEAR / MONTH / DAY被记录条目的日期替换。例如,今天的日志文件将是kt2011-08-15.root.log.txt。内容的示例条目是

2011-08-15 | 19:30:02 | ERROR | 18333 | 337 | n/a | dms | default | error | XMLRPC Lucene - addDocument - Reason: Failed to parse XML-RPC request: An invalid XML character (Unicode: 0xb) was found in the element content of the document.

感兴趣的列是第1,第2,第3(值可能是“INFO”,“DEBUG”等,但我只对“ERROR”是值时感兴趣)和最后一列是记录消息。

我想要完成的是让这个BASH脚本解析具有跨越活动的最后一小时的条目的文件(如第1和第2列中所定义),以及第4列是否包含字符串“ “ERROR”,然后显示最右侧列的内容。当我试图确定如何根据$CURTIME$OLDTIME来解析日志文件时,我的困惑就来了,当午夜到来时我变得更糟,然后我必须搜索前一天的日志文件。我宁愿不对所有日志文件进行毯式grep样式搜索,因为数量和大小可能过多,但如果必须这样做,那么就这样吧。

2 个答案:

答案 0 :(得分:2)

 awk -F ' \\| ' -v "d=$(date -d "1 hour ago" -u +%Y-%m-%d@%H:%M:%S)" '$3 == "ERROR" && $1"@"$2 > d'

答案 1 :(得分:1)

这就像在awk中进行字符串比较一样简单。当您通过午夜时,只需将$OLDDATE文件添加到搜索中:

if [ "$CURDATE" != "$OLDDATE" ]; then
   cat "kt$OLDDATE.root.log.txt" "kt$CURDATE.root.log.txt"
else
   cat "kt$CURDATE.root.log.txt"
fi | awk -F "|" -v olddate=$OLDDATE -v oldtime=$OLDTIME -v curdate=$CURDATE 'BEGIN{olddate=olddate " "; curdate = curdate " "; oldtime = " " oldtime " "}
$1 == olddate && $2 >= oldtime && $3 == " ERROR "{print $0}
$1 > olddate && $3 == " ERROR "{print $0}'

可以与glenn的解决方案相结合,缩短时间。

相关问题