ログファイルから特定のパターンを持つ2つの日付を抽出し、2つの日付を比較します。

ログファイルから特定のパターンを持つ2つの日付を抽出し、2つの日付を比較します。

私の接続プーリングツールに問題があるようです。データベース接続を取得するには膨大な遅延があります。
私が達成したいのは、このイベントが発生したときにログファイルからすべてのケースをインポートすることです。

関連ログエントリは次のとおりです。

...
2018-03-12 16:18:44,070 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtaining JDBC connection
...
2018-03-12 16:20:23,172 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtained JDBC connection
...

それからパターンDEBUG JDBC接続のインポート「発生後に日付を抽出します」2018-03-12 16:18:44,070「そしていつモード」DEBUG JDBC接続のインポート'検索して日付を抽出し、2つの日付を比較します。差が2秒を超えると記録します。

1行のコードでこの問題を解決するのはかなり複雑ですが、プログラムを書かなくてもこの問題を解決できますか?

ベストアンサー1

これを処理するには、次のawkスクリプトを使用します。スクリプトは「取得」および「取得」文字列を検索します。一般的なケースは、最初に「取得」文字列を検索し、次に「取得」文字列を検索することです。 「取得した」行が最初に見つかった場合、その行はd1設定されていないかゼロになるため報告されません。それ以外の場合は、日付の主要部分(カンマの前)を抽出してそれをエポックの後の秒に変換し、ミリ秒を再度追加します。値がに保存されますd1

「得られた」文字列を見ると、その日付が同じ方法で計算され、違いを確認して2秒を超えると報告します。どちらかをリセットしてd1プロセスを再起動します。

以下をスクリプトに保存し、必要に応じて名前を付けることができalert-jdbc.awkますawk -f alert-jdbc.awk < log-file-here

このスクリプトでは、任意の日付を変換するためにGNU日付ユーティリティが必要です。

/DEBUG Obtaining JDBC connection/ {
  split($1 " " $2, dates, /,/)
  "date -d \"" dates[1]"\" +%s" | getline seconds
  d1=seconds + dates[2]/1000
}

/DEBUG Obtained JDBC connection/ {
  if (d1) {
    split($1 " " $2, dates, /,/)
    "date -d \"" dates[1]"\" +%s" | getline seconds
    d2=seconds + dates[2]/1000
    if (d2 - d1 > 2) {
        print "More than 2 seconds for: " $0
    }
    d1=0
  }
}

おすすめ記事