背景
任何程序運行起來免不了產生很多日志,其中錯誤日志需要最為關心的。在某些時候會將錯誤日志和正常日志分開,但我們的系統卻沒有這麼做。更麻煩的是,每個小時存儲一個日志文件,所以每次為了查找當天是否有錯誤信息需要打開N個文件,而且不能用grep因為需要把整個堆棧抓取下來。
SHELL
本人對shell完全是初學,磕磕碰碰寫了個腳本。主要邏輯是判斷ERROR的日志級別的那一行開始記錄,直到碰到下一個INFO或者DEBUG的日志級別行。
#!/bin/bash
isInErrorBlock=false
strArray=()
count=1
while read line
do
#echo "Line $count:"
arrayIdx=$count%10
strArray[$count]="$line"
idx=$(expr match "${strArray[$count]}" ".*ERROR")
if [ $idx -le 0 ];
then
idx=$(expr match "${strArray[$count]}" ".*Exception*")
fi
idx2=$(expr match "${strArray[$count]}" ".*DEBUG")
idx3=$(expr match "${strArray[$count]}" ".*INFO")
if [ $idx -gt 0 ] ;
then
if ! $isInErrorBlock;
then
echo 'print out previous lines'
isInErrorBlock=true
echo ${strArray[$count]}
fi
else
if [ $idx2 -gt 0 ] || [ $idx3 -gt 0 ] ;
then
isInErrorBlock=false
else
if $isInErrorBlock;
then
echo ${strArray[$count]}
fi
fi
fi
count=$[ $count+1 ]
done
#echo "finish\n"
exit 0
效果
基本達到了要求,對於每個目錄 cat *log | sh find_error.sh 能夠將整個堆棧單獨輸出到一個文件。但是效率很慢,不知道如何才能提高SHELL的運行效率。