シェルを使用してログファイルから最後の5分間のログを抽出する

シェルを使用してログファイルから最後の5分間のログを抽出する

ログファイルから最後の5分間のログを抽出する必要があります。これが私のログファイルです

[2022-02-08 13:26:21:352] [ERROR] [iBus Connection LifeCycle - CCMHost_DummyDevice_Backup_AD2::Management:::NRMCMO_FLPROD2] [com.example]
  + Message: Could not create an administered connection factory: Java heap space
  + Throwable: java.lang.OutOfMemoryError: Java heap space

[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
  + Message: Unable to Initialize Connection
  + Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
  + Message: Unable to Initialize Connection
  + Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-01017, TNS:listener does not currently know of SID given in connect descriptor


[2022-02-08 15:05:04:056] [ERROR] [JMS Session Delivery Thread - The user's password has expired.] [com.example]

これを使ってみましたが、うまくいきませんでした

awk -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" -v d2="$(date "+%Y-%m-%d %H:%M:%S:%3N")" '$0 > d1 && $0 < d2 || $0 ~ d2' filelog.log

ご協力いただければ幸いです

答え1

これは、ログ行の最初の文字が角括弧であるため、比較がうまくいかないため機能しませんでした。比較するログ行の日付部分だけを抽出すれば、機能するはずです。ここでは、例の行を使用できるように日付をハードコーディングしていることに注意してください。

awk -v d1="2022-02-08 15:04:00" -v d2="2022-02-08 15:08:00" 'd1 < substr($0,2,19) && substr($0,2,19) < d2 || substr($0,2,19) ~ d2' filelog.log

実際にはコマンドを簡略化できます。2 時間前より最近の時刻のみを対象とするため、「d2」を完全に削除できます。日付が実際に表示される行のみを対象とする場合は、日付がスタンプされた行と同様に、一致する行が「[」で始まるように指定することで、他の行との不自然な一致を防ぐことができます。

awk -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" '/^\[/ && d1 < substr($0,2,19)' filelog.log

一致する各日付スタンプの下の追加行も考慮し、すべての有効な行エントリの間に実際に空白行がある場合は、それを使用してレコード区切り記号を変更し、追加情報を取得して「[」のチェックを省略できます。これは、他の行がフィルタリングされる個別の行ではなく、同じレコードの一部であるためです。

root@2ec99a4edaa9:/tmp# awk -v RS= -v d1="2022-02-08 15:04:00" 'd1 < substr($0,2,19)' filelog.log
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
  + Message: Unable to Initialize Connection
  + Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
  + Message: Unable to Initialize Connection
  + Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-01017, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:05:04:056] [ERROR] [JMS Session Delivery Thread - The user's password has expired.] [com.example]

最後に、出力の読みやすさのために空白行を残しておきたい場合は、-v ORS="\n\n"awk ステートメントに追加するだけです。

全体として、変更されたコマンドは次のようになります。

awk -v RS= -v ORS="\n\n" -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" 'd1 < substr($0,2,19)' filelog.log

関連情報