1. 程式人生 > >日誌結構化,SQL來查詢

日誌結構化,SQL來查詢

通常,日誌檔案都是文字格式,其中的內容是非結構化的文字串。這就使得我們查詢日誌資訊時,一般只能使用文字編輯軟體的搜尋功能,輸入關鍵字後,靠眼力去偵查每處匹配結果。在日誌量不大,或者只是偶爾查一下時,這麼操作倒也無妨。不過,再簡單的事情也怕多次重複。如果需要頻繁查詢,量變就可能引起質變。如果每次還都要靠人工搜尋,那麼就算有再好的視力,也會有頭暈目眩的時候。因此,想要輕鬆查詢日誌,就必須找到一款合適的工具,有了合適的工具,就可以一邊喝著咖啡,一邊輕彈條件回車就行了。

工具裡面,首先想到的,就是利用各種計算機開發語言,外加關係資料庫。但這類工具開發過程繁瑣,還需要準備好多工作環境,包括配置語言開發環境,安裝資料庫服務,安裝資料庫查詢應用等。

對於這麼“重”的方案,我們果斷撇開。因為今天就要介紹一個輕巧方便的工具——集算器,利用集算器,可以將文字日誌變成結構化資料,然後就可以使用我們熟悉的 SQL 式查詢了。

這裡,我們利用到了集算語言 (Structured Process Language,簡稱 SPL) 的兩大優點:

  • 將日誌內容結構化為資料表結構,SPL 遠比常用開發語言簡單、易用、直觀。
  • SPL 支援直接對結構化的檔案進行 SQL 查詢,不再需要安裝配置第三方資料庫軟體。

下面就是具體的實施過程。

1、日誌結構分析

不同的日誌檔案,其內容格式五花八門,每一個看上去都雜亂無章。但對於某個特定的具體的日誌來說,它一定會有它自己的結構。拿到日誌檔案後,首先要做的就是分析日誌內容,提煉資料結構,總結出可以結構化的欄位。

作為示例,我們用騰訊視訊軟體下的一個啟動日誌來做案例。如果你也用過騰訊視訊,就可以利用下面的程式碼來體驗和學習,分析一下自己的使用行為了。這個日誌檔案,位於當前使用者的 AppData 路徑下,並且以 QQLive.exe[Main] 開頭。在我的機器上,這個檔案就是:

C:\Users\[Joancy]\AppData\Roaming\Tencent\QQLive\Log\QQLive.exe[Main][2018-8-3 21-5-35-557][12164].log

上述路徑中 [Joancy] 是我的 Windows 登入使用者名稱,在你的機器中,將會是你的使用者名稱。QQLive.exe[Main]開頭的日誌檔案有很多,隨便取一個就可以。

下面就是這個日誌檔案中的兩行:

[18-07-19 14:35:06][9416]-[31ms][QQLiveMainModule.dll][CQQLiveModule::ParsCommandLine] cmd=”C:\Program Files (x86)\Tencent\QQLive\QQLive.exe” -system_startup
[18-07-19 14:35:08][9416]-[2266ms][HttpModule.dll][CDownloadMgr::AddTask]keyid = 1,url = http://182.254.116.117/d?dn=vv.video.qq.com.&ttl=1

可以看到,這個日誌的內容比較規整,一行一條記錄。每行中一對中括號中的內容為一節,對應一個欄位。只是最後的兩節有點特殊,其中倒數第二節可以省略,而最後一節沒用中括號括起來。這樣,我們就可以整理出日誌表的資料結構如下,並且把第一行內容作為對應的示例:

欄位名 型別 分節內容
1 記錄時間 DateTime [18-07-19 14:35:06]
2 執行緒編號 Integer [9416]
3 載入時刻 Integer [31ms]
4 載入模組 String [QQLiveMainModule.dll]
5 載入函式 String [CQQLiveModule::ParsCommandLine]
6 日誌內容 String cmd=”C:\Program Files (x86)\Tencent\QQLive\QQLive.exe” -system_startup

表(1)
解析各個欄位時,需要注意:

1) 記錄時間: 由於年份只有兩位,所以在轉成日期時間型別時,需要指定相匹配的日期格式,否則 18 就會被當成公元 18 年,而不是 2018 年了。具體的操作方法是開啟集算器選單中的選項,在彈出的視窗中點選環境頁面,設定屬性‘日期時間格式’為‘yy-MM-dd HH