日誌聚類分析可以理解為AIOps智慧化運維的一個子內容,對於日誌本身也分為了作業系統日誌,資料庫和中介軟體日誌,業務系統本身自定義錯誤日誌等。
今天只分析對業務系統錯誤日誌聚類分析。
日誌聚類分析背景我們實施ESB服務匯流排專案,因此拿ESB匯流排或SOA整合平臺來舉例。
在SOA整合平臺實施過程中,由於註冊和接入了大量的業務系統和介面服務,因此每天都產生大量的介面呼叫錯誤日誌資訊,峰值期間一天的錯誤日誌量也達到好幾萬條。
那麼面對這麼多的錯誤日誌,如何快速的定位究竟是中介軟體本身錯誤還是業務類異常,如果是業務類異常本身又主要是由哪些介面,哪些服務消費方引起的就成為一個關鍵內容。
是否能夠直接Group By?
對於錯誤日誌資訊,一般來講很難直接Group by進行分類彙總,因為業務系統在產生錯誤日誌的時候往往會依賴於錯誤日誌模板,模板中引數變數資訊,導致最終輸出的日誌並不同。
比如前面預算校驗,實際模板可能是:
BIZ001:(Param1):預算校驗不透過。申請(Param2),實際剩餘(Param3)
因此實際上你無法簡單的做彙總處理。
問題轉化
經過基本分析,你會發現日誌聚類本質還是文字相似度比較,基於文字串的相似度進行聚類。文字傳的相似度可以兩兩比較,只要相似的即可聚類到一起。
比如下面的錯誤日誌資訊:
1.BIZ0465:要釋放的單據資訊不存在, 單據編號:54004541 單據型別:BZ_WHTBZ2.BIZ0465:要釋放的單據資訊不存在, 單據編號:54027476 單據型別:BZ_YHTBZ3.BIZ0465:要釋放的單據資訊不存在, 單據編號:54164614 單據型別:BZ_WHTBZ4.BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(88909.83元) 小於 本次金額(280000元)5.BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(897.92元) 小於 本次金額(8668元)6.BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(9.27元) 小於 本次金額(18.3元)
經過肉眼觀察,我們也很容易發現實際應該聚為兩類錯誤資訊。1-3是一類,4-6是一類。如果從上面的資訊我們也很容易抽象出後端對應的錯誤日誌模板。
//BIZ0465:要釋放的單據資訊不存在, 單據編號:@param1 單據型別:@param1//BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(@param1) 小於 本次金額(@param2)
把以上思考清楚後,可以看到日誌聚類不能簡單的照搬當前已有的文字聚類方法,而是應該在當前文字相似度比較,分詞技術上進行最佳化,給出最佳的一種日誌聚類演算法。
在這裡還是從文字預處理,分詞,相似度計算幾個方面來進行總結。
文字預處理對於文字預處理,經常談到的是去除停用詞,比如常見的,你,我,他,的,啊等詞語,這些詞出現頻繁,實際上本身沒有太大的作用。
我們可以構建一個停用詞的詞庫,對出現的停用詞進行預處理。
其次,當我們觀察大量的日誌輸出後,可以看到文字預處理的另外一個重點是對標點符號的處理,對基於模板填寫內容的識別。
標點符號處理
對於經常出現的冒號,逗號,等於號等都是日誌裡面最常見的。這些標點符號本身就應該是後續分詞的分割點。比如:
單據編號:54004541 單據型別:BZ_WHTBZ
這個直接基於空格和標點符號分詞,應該拆分為:
單據編號
54004541
單據型別
BZ_WHTBZ
模板引數內容分析
經過對日誌分析,你會發現類似(),類似[]或【】等都是最容器在裡面填寫引數化內容的。對於這種情況我們完全可以進行識別。
當發現這些特殊標點符號後,可以考慮直接對裡面的內容進行去除處理,即將日誌中分析可能是引數化的差異內容去除掉。
比如前面談到的:
BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(88909.83元) 小於 本次金額(280000元)BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(897.92元) 小於 本次金額(8668元)BIZ0270:按照維度組合查詢相關成本費用預算的可用資金(9.27元) 小於 本次金額(18.3元)服務業務處理不透過[158605363]服務業務處理不透過[158605364]服務業務處理不透過[158605365]
這個在去除掉括號內容後,本身就變成了完全相同的文字。
進行SQL Group By處理
在前面做完預處理後,實際完全可以先進行一次Group By操作,基於文字進行彙總,這個時候往往已經可以彙總出一下日誌完全相同的異常日誌。
比如我們可以取一個Top10資料,將這Top10的日誌資料直接移出日誌列表。後續的文字相似度分析完全沒有必要再對這些資料進行分析。一個10萬條的錯誤日誌資料列表,經過上述處理後最終待分析剩餘日誌往往不會超過50%。
分詞對於分詞,當前主要有兩種演算法,一種是基於已有的詞典庫,一種是基於統計的機器學習。
基於詞典的分詞演算法分為以下幾種:正向最大匹配法、逆向最大匹配法和雙向匹配分詞法等。基於詞典的分詞演算法是應用最廣泛、分詞速度最快的。基於統計的機器學習演算法法是HMM、CRF、SVM、深度學習等演算法,比如stanford、Hanlp分詞工具是基於CRF演算法。
常見的分詞器都是使用機器學習演算法和詞典相結合,一方面能夠提高分詞準確率,另一方面能夠改善領域適應性。
日誌內容的分詞
在前面我給出了前提,即重點對業務系統定義的業務錯誤日誌,系統日誌分析。這些日誌大部分都是基於引數化模板來產生。我們還是舉前面的例子來說明:
在基於標點符號和空格進行分詞拆分後,得到:
要釋放的單據資訊不存在單據編號
這個資訊實際上再進行分詞拆分本身對於日誌聚類分析並沒有太大的意義。上面的這個提示本身就已經是一個整體,沒有必要再進行拆分。
其次,對於業務系統的詞典庫本身也是一個細分的領域,如果用當前主流的詞典庫來對日誌文字進行分詞,往往並不會得到很好的結果。
即使要進行分詞,最好的方法也是需要對大量日誌進行機器學習訓練,加上人工修正,最好得到一個適用於日誌分析的分詞庫。
日誌文字相似度分析在進行完日誌預處理後,我們對剩餘的日誌列表進行分詞處理。在進行完分詞後,得到一個完整的分詞列表。
詞頻向量構建
對完整的日誌列表進行分詞後,可以看到最終形成的分詞列表接近上萬,那麼顯然不可能都用做詞頻向量的構建。因此在分詞完成後,我們需要對分詞的詞頻進行分析,僅僅對詞頻達到某一個基準值的才用於後續構建詞頻向量使用。
比如前面分詞會得到:
單據編號 | 54004541 | 單據型別 | 54004541 |
但是實際基於詞頻分析,最終用於構建詞頻向量的僅僅只有 單據編號和單據型別。
在經過上面分析後,我們會得到一個完整的用於構建詞頻向量的集合,類似如下:
[預算,單據編號,單據型別,異常,不透過,BIZ0270,金額,.......]
注意這個詞頻向量是一個全集。
構建詞頻向量子集
在前面工作完成後,可以開始對日誌資料進行遍歷,基於發現的日誌文字,我們可以構建一個詞頻向量的子集。
該日誌文字也進行分詞處理,這個時候處理後的分詞如下:
[預算,訂單編號,0001, 訂單型別,X03675,金額, 22131]
基於和高頻分詞列表庫進行對比,找到一個子集如下:
[預算,單據,訂單編號,訂單型別,金額]
接著對日誌列表資料進行文字相似度對比分析,採用上面的詞頻列表來構建詞頻向量。
TF-IDF演算法
TF-IDF(Term Frequency-inverse Document Frequency)是一種針對關鍵詞的統計分析方法,用於評估一個詞對一個檔案集或者一個語料庫的重要程度。一個詞的重要程度跟它在文章中出現的次數成正比,跟它在語料庫出現的次數成反比。這種計算方式能有效避免常用詞對關鍵詞的影響,提高了關鍵詞與文章之間的相關性。
其中TF指的是某詞在文章中出現的總次數,該指標通常會被歸一化定義為TF=(某詞在文件中出現的次數/文件的總詞量),這樣可以防止結果偏向過長的文件(同一個詞語在長文件裡通常會具有比短文件更高的詞頻)。
IDF逆向文件頻率,包含某詞語的文件越少,IDF值越大,說明該詞語具有很強的區分能力,IDF=loge(語料庫中文件總數/包含該詞的文件數+1),+1的原因是避免分母為0。TFIDF=TFxIDF,TFIDF值越大表示該特徵詞對這個文字的重要性越大。
實際上對於日誌文字的相似度分析,採用TF詞頻基本就已經滿足需求,並沒有必要再去計算IDF值。比如對於兩條日誌資訊,經過計算後為:
日誌文字1:[1,0,1,1,1]日誌文字2:[1,1,1,1,1]
在得到詞向量後,我們直接進行餘弦相似度比較即可。
餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。這個時候將餘弦相似度大於某個百分比的日誌文字歸於一類。
基於餘弦相似度進行聚類
當然,在計算完餘弦相似度後可以基於常用的k-means聚類演算法進行聚類分析。
K-means演算法是非常經典的聚類演算法。是一種簡單實用的聚類演算法,k均值演算法(k-means),由Stuart Lloyd於1957年提出。該演算法雖然無法保證一定能夠得到最優聚類結果,但實踐效果非常好。
其演算法思路如下:
先選K個初始聚類點作為初始中心點,然後計算其他所有點到K個聚類點的距離做聚類,將點分到最近的聚類,聚完類後中心點發生變化了,於是更新中心點。然後再計算其他所有點到這K箇中心點的距離重新聚類,中心點又會發生變化,如此迭代下去。
聚類精度
經過近5萬條資料的聚類分析,K-Means的聚類精度基本可以達到80%以上,基本可以滿足當前日誌聚類分析的需求。
簡單總結基於前面分析可以看到整個日誌聚類分析可以分為如下幾個關鍵步驟:
1.進行日誌文字預處理
2.進行分詞
3.詞頻統計,文字轉向量
4.計算餘弦相似度
5.基於聚類演算法進行聚類
在聚類結果如果無法滿足需求的情況下,還需要提供人工修正的功能,其中人工修正包括了高頻詞的定義,停用詞定義,詞權重的定義等。