Shell-Script
從具有特定模式的日誌文件中提取 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 秒,則記錄。
我知道用一行程式碼解決它是相當複雜的,但是不編寫程序就可以做到這一點嗎?
我將使用下面的 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 } }