Shell-Script

從具有特定模式的日誌文件中提取 2 個日期並比較 2 個日期

  • May 16, 2018

我的連接池工具似乎有問題。獲取數據庫連接時有很大的延遲。

我試圖實現的是在發生此事件時從日誌文件中獲取所有案例。

相關的日誌條目看起來像

...
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 秒,則記錄。

我知道用一行程式碼解決它是相當複雜的,但是不編寫程序就可以做到這一點嗎?

我將使用下面的 awk 腳本來處理它。該腳本搜尋“obtaining”和“obtained”字元串。典型的情況是先找到“obtaining”字元串,再找到“obtained”字元串;如果首先找到“獲得”行,d1則將未設置或為零,因此不會報告。否則,我們提取日期的主要部分(在逗號之前),將其轉換為 seconds-since-the-epoch,然後重新添加毫秒。該值保存到d1.

一旦看到“obtained”字元串,它的日期就會以相同的方式計算,然後我們檢查差異;如果超過 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
 }
}

引用自:https://unix.stackexchange.com/questions/444110