特定のUUIDで開始されたhttpスレッドの関連データをログファイルから抽出したい。ログの例:
_2018-09-26 06:34:24,815 INFO [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:25,224 WARN [com.xxx.xxx.xxx] (http-threads-threads - 74391) Some log message
2018-09-26 06:34:26,782 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74399) Some log message
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
at com.xxx.xxx.xxx(someclass.Java:114) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:65) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:85) [classes:]
2018-09-26 06:34:26,950 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 74256) Unauthorized: com.xxx.xxx.xxx: Unauthorized
at com.xxx.xxx.xxx(someclass.Java:39) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:49) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:45) [somejar.jar:1.0.0]
2018-09-26 06:34:26,952 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74395) Some log message
2018-09-26 06:34:27,014 WARN [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
2018-09-26 06:34:27,530 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74365) Some log message
_
すでにUUIDを検索し、grepとBASH_REMATCHを使用してスレッド番号を抽出できます。スレッド番号がわかれば、「http-threads-threads-73244」で検索できます。次に、その文字列を含むすべての行と、これらの行の後に最終的な例外(タブを含む行)を出力します。
次のような出力が必要です。
_2018-09-26 06:34:24,815 INFO [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
at com.xxx.xxx.xxx(someclass.Java:114) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:65) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.Java:85) [classes:]
2018-09-26 06:34:27,014 WARN [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
_
一致後のタブ付き行の数が可変であるため、_grep -A 3
_を使用できません。
_awk '/http\-threads\-threads \- 73244/{print $0; getline}/\tat/{print $0}' log.log
_を使用すると、他のタブ付き行も印刷されます。
awk '/http\-threads\-threads \- 73244/{a=1;print}/(2[0-9][0-9][0-9]\-[0-1]\-[0-9])/{a=0}' log.log
を使用しても、タブ付きの行はまったく印刷されません。
完璧なソリューションでは、前に余分な「grep」と「BASH_REMATCH」を削除してUUIDを使用することもできますが、スレッド番号を「入力」として使用するソリューションではまったく問題ありません。
誰かがこれに対する解決策を持っていますか?
次のAWKスクリプトはUUIDと一致し、関心のある対応する行を出力します。
#!/usr/bin/awk -f
/UUID: 111-222-333-444-555/ {
tid = substr($7, 1, length($7) - 1)
}
/^[^\t].*http-threads-threads/ {
if (substr($7, 1, length($7) -1) == tid) {
matched = 1
print
} else {
matched = 0
}
}
/^\t/ && matched
最初のブロックはUUIDと一致し、対応するスレッド識別子を格納します。
2番目のブロックは、「http-threads-threads」を含むタブで始まらない行に一致します。 7番目のフィールドがスレッド識別子と一致する場合、スクリプトは一致するブロックにいることを通知し、現在の行を出力します。それ以外の場合、スクリプトは、一致するブロックに含まれていないことを示します。
3番目のブロックは、一致するブロック内にあるときにタブで始まる行と一致し、それらを印刷します(現在の行の印刷がデフォルトのアクションです)。