當前位置:
首頁 > 最新 > 錯誤日誌不規範?聚類可以幫上你

錯誤日誌不規範?聚類可以幫上你

作者|鄒磊 張明

編輯|Vicky

簡介

軟體錯誤日誌不規範導致不好分析? 本文介紹一種軟體錯誤日誌聚類方法,發表於《小型微型計算機系統》。

該方法通過引入日誌模板提取、日誌壓縮方法降低日誌規模;通過引入計算文檔頻率提取特徵詞方法提高聚類準確性並降低數據維度;結合 Canopy 聚類和 K-means 聚類演算法提升聚類效果。通過在實際運維中實際系統的檢驗證明,本文提出的方法不但具有比較理想的聚類效果,而且滿足生產環境中的性能要求。

背景及挑戰

大型軟體在實際運營過程中,針對所維護的各項服務業務可能遇到的各種問題,收集相應的錯誤日誌。因此,將問題對應的錯誤日誌及時反饋給相應的研發人員是排除問題的首要因素。在大型軟體收集日誌的過程中,即使採用採樣的方式,往往也是以TB甚至PB為單位。並且,很多錯誤日誌是完全相同或者相似的,錯誤日誌的不同種類僅占極少數。因此,對海量錯誤日誌進行預先聚類就顯得十分重要。

業務的快速發展,往往帶來日誌量急速增長,同時相應的日誌規範沒有跟上,以及研發人員素質參差不齊,導致收集的錯誤日誌不規範、干擾數據較多。這些都給錯誤日誌聚類帶了巨大的挑戰:

日誌數量巨大。某大型機構某運維場景下錯誤日誌的收集數量約為 150 萬條每分鐘,大小約 3.3GB 每分鐘;以此推算,相應的數據為 9000 萬條每小時,200GB每小時;21.6 億條每天,2.4TB 每天。

變數較多,無法全部清洗。錯誤日誌信息中的變數名、變數名與變數間的格式無法預知,且變數較多,無法通過清洗變數來分析出所有的錯誤日誌模板。

干擾數據較多,難以提取特徵信息。錯誤日誌信息可能包含如 token、id、key、ticket、等 md5、base64 編碼的干擾數據,此外還有中文、Unicode 等干擾,對提取錯誤日誌的特徵信息造成了很大的難度。

聚類效果、性能要求較高,難度較大。對海量非規範的錯誤日誌進行聚類,要達到聚類效果較好、性能較高,並且需要經得起公司運維繫統的實際驗證,難度較高。

系統架構

針對上述挑戰,錯誤日誌聚類系統架構由錯誤日誌(數據輸入)、模板提取、日誌壓縮、計算文檔頻率提取特徵詞、建立特徵向量、Canopy 粗聚類、K-means 細聚類、錯誤類別(結果輸出)組成,見圖1。

圖 1 錯誤日誌聚類系統架構圖

系統實現


模板提取模塊:根據替換規則,清洗替換掉錯誤日誌中不相關、不重要的變數和干擾項,進而提取出日誌模板。替換規則可由人工進行配置。以下給出部分初始的替換規則,基於正則表達式進行依次替換,如表1 所示:

表1 部分初始替換規則

例如,"the request url is http://example.com/test"提取的日誌模板為「the request url is 」,「get passenger starrequest error,pid:3287215705920」 提取的日誌模板為 「get passenger star request error pid」 ,而 「incrShowNum: get order_num data: {"id":"916931", "strive_num": "1"}」提取的日誌模板則為「incrShowNum get order_num data id strive_num」。


日誌壓縮:對提取後的日誌模板中大量完全相同的模板進行去重壓縮,輸出相應的日誌模板條數。實現演算法如下:

計算文檔頻率提取特徵詞:使用文檔頻率方法提取出每條錯誤日誌模板的一些特徵詞,用來表徵相應錯誤日誌的特徵信息。實現演算法如下:


建立特徵向量:將所有錯誤日誌模板提取出來的特徵詞合併成一個集合,其中每一個元素構成向量空間的一個維度,建立向量空間模型,從而每條錯誤日誌可以由提取出來的特徵詞確定相應的特徵向量。

提取出所有錯誤日誌模板的特徵詞後,設所有特徵詞的集合為 S={ fw1 , fw2 ,…. , fwn } ,並依次構成 n 維向量空間的各個維度,則對於錯誤日誌L及其特徵詞集合 FWL ,其特徵向量定義為

所有錯誤日誌的特徵向量構成特徵向量集合D。


Canopy粗聚類:使用 Canopy聚類演算法先對數據進行粗聚類,得到聚類數和聚類中心後再使用 K-means 聚類演算法進行進一步細聚類。

Canopy 聚類演算法需要首先設定兩個閾值 T1(鬆散距離),T2(緊湊距離),要求 T1 > T2;然後計算數據點之間的距離,會將距離相接近的數據點放入到一個子集中,這個子集被稱作 Canopy;最後通過一系列計算得到若干個 Canopy,Canopy 之間可以重疊,但不會存在某個數據點不屬於任何 Canopy 的情況。使用 Canopy 演算法聚類後,結果如圖 2 所示。

圖2 Canopy聚類結果圖

其中,T1 過大,則會導致較多的迭代次數,形成較多的 Canopy;T1 過小則效果相反。T2 過大,則會導致一個 Canopy 中的數據較多;T2 過小則相反。由於本文使用 Canopy 聚類演算法僅進行粗聚類,即計算出 Canopy 聚類數,用作下游 K-means 聚類演算法的 K 值,所以聚類精度要求不高,實際工程中設定 T1=2*T2,T2 初始值為 2。


K-means細聚類:取K=Canopy 聚類數,並且選擇 Canopy 粗聚類後的 K 個中心點作為 K 個初始質心,使用 K-means 聚類演算法進行細聚類。

評估


由於聚類沒有統一的評價指標,並且錯誤日誌數據量巨大,無法事先人工標註,目前只能根據實際問題和場景,由相應的領域專家和工程師對聚類之後的結果進行確定和評價。本文經過一段時間對聚類類型和相應的樣本進行了評估,合作的領域專家和工程師認為聚類有效且達到比較理想的效果。某個時間段里聚類效果部分結果如表2所示。

表2 聚類效果部分結果

其中類別是聚類類別的編號,總數是這一時間段中相應的錯誤日誌總數,日誌模板即為提取的日誌模板信息。例如,錯誤類別 11、日誌模板為「stop pay fail ret_info errno errmsg」 的一個日誌樣例為 「errno:80051 errmsg:stop pay fail |ret_info:{"errno":"80051","errmsg":"u5173u5355u5931u8d25"}」;錯誤類別 12、日誌模板為「Warning getBillInfo empty orderId passengerId」 的一個日誌樣例為 「Warning: getBillInfo empty|orderId:3267678|passengerId:159631166」。


語言為 Java,部分測試結果如表3 所示,在幾個不同場景下的測試結果中,處理速度達到 7.31-9.91 萬條每秒。處理速度跟日誌信息具體內容有較大關係,每條日誌信息越長則處理速度較慢,每條日誌信息越短則處理速度較快。

表3模板提取性能


語言為 Java,部分測試結果如表4所示,在幾個不同場景下的測試結果中,壓縮比達到 342.1-1095.8,處理速度達到 40.33-85.47 萬條每秒。壓縮比跟日誌條數大致呈現正相關,即壓縮比隨著日誌條數增加而增大。這表明在短時間內錯誤類別數量維持在一定水平,日誌條數大幅增加不會使得錯誤類別數量急劇上升。

表4 日誌壓縮性能


語言為 Python2.7,部分測試結果如表5所示,其反映了不同壓縮條數和向量維度下 Canopy 的處理時間。壓縮條數越大、向量維度越高,處理時間越長。

表5 Canopy粗聚類性能


語言為 Python2.7,使用 scikit-learn 機器學習庫中的 K-means 聚類演算法,部分測試結果如表6所示,其反映了不同壓縮條數和向量維度下 K-means 的處理時間。壓縮條數越大、向量維度越高,處理時間越長,但遠遠優於 Canopy 粗聚類處理時間。

表6 K-means細聚類性能

結語

本文介紹了一種軟體錯誤日誌聚類方法,通過引入日誌模板提取、日誌壓縮方法降低日誌規模;通過引入計算文檔頻率提取特徵詞方法提高聚類準確性並降低數據維度;結合 Canopy 聚類和 K-means 聚類演算法提升聚類效果。通過在某大型機構運維中實際系統的檢驗,本文提出的錯誤日誌聚類方法,不但具有比較理想的聚類效果,而且滿足生產環境中的性能要求。更多細節可以查閱論文原文獲取:程世文,裴丹,王長進。《軟體錯誤日誌聚類》。小型微型計算機系統,2018,39(05):865-870.。

關注我們


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 智能運維前沿 的精彩文章:

AIOps關鍵技術:日誌模板提取

TAG:智能運維前沿 |