0

ログファイルでエラーエントリをチェックする必要があるスクリプトをBASHで作成しています。これを1時間ごとにcronとして実行する予定なので、過去1時間以内に発生した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時間のアクティビティ(1列目と2列目で定義)にまたがるエントリを持つファイルを解析し、4列目に文字列「ERROR」が含まれている場合です。次に、右端の列の内容を表示します。$CURTIMEに基づいてログファイルを解析する方法を決定しようとすると混乱が生じます$OLDTIME。深夜になるとさらに悪化し、前日のログファイルを検索する必要があります。量とサイズが過剰になる可能性があるため、すべてのログファイルを包括的にgrepスタイルで検索することは避けたいと思いますが、そうする必要がある場合は、そうする必要があります。

4

2 に答える 2

2
 awk -F ' \\| ' -v "d=$(date -d "1 hour ago" -u +%Y-%m-%d@%H:%M:%S)" '$3 == "ERROR" && $1"@"$2 > d'
于 2011-08-15T20:23:22.440 に答える
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のソリューションと組み合わせて、はるかに短くすることができます。

于 2011-08-15T20:32:57.430 に答える