馮士龍,臺憲青,馬治杰
(1.中國科學院 物聯(lián)網(wǎng)研究發(fā)展中心 數(shù)據(jù)與服務研發(fā)中心,江蘇 無錫 214135;2.中國科學院大學 微電子學院,北京 101407;3.中國科學院 電子學研究所 蘇州研究院地理空間信息系統(tǒng)研究室,江蘇 蘇州 215121)
現(xiàn)如今,隨著分布式系統(tǒng)規(guī)模的不斷擴大,其復雜性也越來越高,因此給運維人員維護系統(tǒng)正常運行帶來了嚴峻的挑戰(zhàn)[1]。系統(tǒng)運維人員通常利用系統(tǒng)產(chǎn)生的運行日志來定位異常,但由于分布式系統(tǒng)產(chǎn)生的日志量較大,并且不同的系統(tǒng)會采用不同的容錯機制[2],人工檢索的方法耗時耗力。近些年隨著非結構化日志解析方法[3-5]和機器學習的發(fā)展,基于機器學習的日志異常檢測方法成為了一個研究重點。
基于機器學習的日志異常檢測方法包括基于監(jiān)督學習和基于無監(jiān)督學習兩種?;诒O(jiān)督學習的方法[6-8]的優(yōu)點是檢測精確,但是需要使用提前進行標記的訓練集進行模型的訓練,不適合實際生產(chǎn)環(huán)境。在無監(jiān)督學習的方法中,基于主成分分析(principal components analysis,PCA)[9]和Invariants Ming[10]是兩種比較典型的方法。然而,由于前者對數(shù)據(jù)非常敏感,導致其檢測的精度隨數(shù)據(jù)集的不同變化差異比較大;而后者是一種能夠保證異常檢測準確度的方法,但是其檢測過程十分耗時。因此,這兩種方法在實際異常檢測中效果并不理想。LogCluster[2]是一種基于日志聚類的異常檢測方法。它既能快速的處理大量日志數(shù)據(jù),也能保證異常檢測的精度的檢測。但是LogCluster方法使用會話窗口的方式對日志進行分組,使得該方法只能檢測帶標記符的日志,限制了方法的適用性。
針對LogCluster方法的局限性,本文提出了一種改進的基于LogCluster的異常檢測方法,通過使用滑動窗口的方式對日志進行劃分,擴展了原方法的適用范圍,并且對改進的方法進行了相關的實驗驗證。
本節(jié)首先介紹LogCluster方法的整體結構以及主要步驟,然后分析該方法的局限性。
LogCluster方法主要分為兩個階段:構建階段和生產(chǎn)階段,總體結構如圖1所示。構建階段和生產(chǎn)階段均包含4個步驟:日志解析、特征提取、日志聚類和代表性日志序列提取。構建階段通過提取代表性的日志序列來構建知識庫。在生產(chǎn)階段將實際生產(chǎn)環(huán)境中采集的日志提取出代表性日志序列,然后檢查它是否已經(jīng)存儲在知識庫中,如果知識庫中已經(jīng)存在,那么將相應解決方案反饋給工程師,否則將對知識庫進行更新。
接下來,根據(jù)圖1中的LogCluster整體結構,我們分別介紹日志解析、特征提取、日志聚類、代表性日志序列提取和重復性檢查5個步驟。
圖1 LogCluster整體結構
1.1.1 日志解析
現(xiàn)代系統(tǒng)的運行日志一般是指由系統(tǒng)生成的非結構化日志文本,它包含靜態(tài)消息和動態(tài)參數(shù)兩種字段,其中靜態(tài)消息字段也叫日志事件,表示每條日志的事件類型。日志解析的主要目的是從原始日志中提取日志事件。
LogCluster中日志解析采用基于聚類的日志關鍵字提取技術[11](log key extraction,LKE)。圖2展示了LKE方法的解析效果。圖中上方為原始日志信息,下方分別為日志事件文本和標記符與日志事件對應的結構化日志文本。
1.1.2 特征提取
特征提取主要是將解析后的日志特征進行分析提取,并進行矢量化,以便進行日志聚類。該步驟主要包含日志序列劃分和日志矢量化兩部分。日志序列劃分將解析后的日志劃分為多個日志序列。日志矢量化主要分為兩步,首先將日志序列轉(zhuǎn)化為日志事件計數(shù)向量,然后對向量進行加權。日志特征提取流程如圖3所示。
日志序列劃分:為了提取特征,首先需要將日志數(shù)據(jù)分成不同的組。該方法中使用會話窗口將日志鏈接為不同的日志序列。會話窗口基于標識符,標識符用于標記某些日志數(shù)據(jù)中的執(zhí)行軌跡。例如,帶有block_id的HDFS日志會記錄某些塊的讀寫等操作。依據(jù)帶有同一標記符的日志代表同一會話的相關性,將日志根據(jù)標記符進行分組,其中每一個會話窗口都有唯一的標記符。如圖3中所展示的,圖中的日志都擁有相同的block_id,所以將含有blk_904791815409399662和含有blk_904791815415648154的日志行都鏈接到一起,形成多組日志序列。
圖2 日志解析效果
圖3 日志特征提取
日志矢量化:將日志事件序列轉(zhuǎn)化為事件計數(shù)向量,即日志事件序列中的每個日志事件出現(xiàn)的次數(shù)。然后使用基于IDF[12](inverse document frequency)和基于對比的方法對事件計數(shù)向量進行加權,形成加權事件計數(shù)向量,如圖3所示。
(1)基于IDF的事件權重:如果一個日志事件頻繁的出現(xiàn)在多個日志序列中,那么它的判別能力就低于只出現(xiàn)在少數(shù)日志序列中的事件。
(2)基于對比的事件權重:在實驗環(huán)境和生產(chǎn)環(huán)境都出現(xiàn)了的事件對異常識別的判別能力不如只出現(xiàn)在生產(chǎn)環(huán)境中的事件,僅在生產(chǎn)環(huán)境出現(xiàn)的事件更有可能反映異常,因此應該具有更高的權值。
1.1.3 日志聚類
日志聚類主要是將特征提取步驟得到的加權事件計數(shù)向量進行聚類。LogCluster計算日志序列之間的相似度,然后采用層次聚類對相似的日志序列進行聚類,形成正常和異常兩種集群。
1.1.4 代表性日志序列提取
代表性日志序列提取將從正常和異常兩種集群中提取代表性日志序列,構建知識庫。對于每個集群,通過選擇集群的質(zhì)心來作為代表性日志序列。計算每個日志序列距離集群內(nèi)其它日志序列的平均距離,選擇平均距離最小的作為每個集群的代表性日志序列。
1.1.5 重復性檢查
重復性檢查主要對生產(chǎn)階段產(chǎn)生的日志提取的代表性日志序列與知識庫中的日志序列進行對比。采集生產(chǎn)階段產(chǎn)生的日志經(jīng)過上述4個步驟后提取代表性日志序列,計算與知識庫中存儲的日志序列之間的相似度,如果知識庫中已經(jīng)存在,那么將該日志序列對應的異常解決方案進行反饋。將知識庫中不存在的日志序列進行人工判斷,然后對知識庫進行更新,從而減少人工檢查的日志序列的數(shù)量。
LogCluster方法雖然能有效的進行異常檢測,并減少人工檢查的工作,但是在特征提取步驟采用了會話窗口的方式進行日志序列的劃分,這種方法使得LogCluster方法只能處理帶有標記符的日志。而對于日志本身不帶有標識符或者無法后期為日志增加標記符的日志類型,該方法無法進行特征提取。特征提取步驟的局限性影響了LogCluster方法的適用性。
針對LogCluster異常檢測方法的局限性,本文提出了一種改進的基于LogCluster的日志異常檢測方法,即SW(Sliding Window)-LogCluster。SW-LogCluster通過采用滑動窗口代替LogCluster的會話窗口,可以有效擴展LogCluster方法的適用性。圖4展示了LogCluster與SW-LogCluster方法的對比,SW-LogCluster采用與LogCluster相同的整體結構,關鍵的區(qū)別在特征提取部分。特征提取分為日志序列劃分和日志矢量化兩個步驟,LogCluster使用會話窗口的方式進行日志序列劃分,而SW-LogCluster使用滑動窗口的方式進行日志序列的劃分。
圖4 SW-LogCluster與LogCluster方法對比
滑動窗口方法是一種基于時間戳的序列劃分方法,時間戳記錄每條日志產(chǎn)生的時間。窗口由兩個屬性組成:窗口大小ΔT和步長Δt,ΔT表示每個窗口包含的時間間隔,Δt表示窗口每次滑動的時間間隔,如圖5所示。窗口以步長大小的時間段向后滑動。一般來說,我們設置步長小于窗口大小,這樣每次窗口滑動會形成不同窗口之間的重疊,可以增加劃分出的日志序列,減少窗口覆蓋不均勻產(chǎn)生的誤差。
圖5 滑動窗口
SW-LogCluster采用合適的窗口大小以及步長對日志進行劃分,將同一個滑動窗口時間段內(nèi)產(chǎn)生的日志劃分為一組日志序列,然后生成事件計數(shù)向量。圖6為一個使用滑動窗口劃分日志序列并生成事件計數(shù)矩陣的實例,圖中左邊為原始日志經(jīng)過解析后生成的結構化日志,每個日志行代表日志生成的時間和該行對應的日志事件。假設滑動窗口的窗口大小為6 h,步長為1 h,第一個窗口產(chǎn)生的日志序列S1為第1行日志的時間到之后6 h內(nèi)的日志行代表的日志事件,即日志序列圖中的第一行(由于事件太多,沒有完全展示)。第二個窗口根據(jù)步長向后滑動1 h,產(chǎn)生的第二個日志序列S2為第4行日志的時間到之后6 h內(nèi)的日志行代表的日志事件,即日志序列圖中的第二行。然后進行日志向量化,將日志序列轉(zhuǎn)換為事件計數(shù)矩陣。
圖6 滑動窗口劃分日志序列實例
通過我們的方法,能夠有效的將原始日志解析后的結構化日志進行劃分,產(chǎn)生多組日志序列,進而應用到日志向量化的步驟中。由于滑動窗口方法基于時間戳的特性,SW-LogCluster方法不僅可以應用于LogCluster方法針對的帶標記符的日志,還能有效的對不帶標記符的日志進行異常檢測,在擴展LogCluster方法適用性的基礎上保證異常檢測的效果。
本文主要采用Precision(精準率)、Recall(召回率)和F_measure(綜合評價標準)來作為評估指標。
Precision表示檢測出來的正確異常占檢測出來的所有異常的比例,計算公式為
(1)
其中,TP為檢測出來的正確異常的數(shù)量;FP為將非異常檢測為異常的數(shù)量。Precision的值越高,說明異常檢測方法檢測出的正確異常的準確率越高。
Recall表示檢測出來的正確異常占實驗數(shù)據(jù)中所有異常的比例,計算公式為
(2)
其中,F(xiàn)N為將異常檢測為非異常的數(shù)量。Recall的值越高,說明異常檢測方法將異常漏掉的比例越低。
F_measure表示Precision和Recall兩項指標的相對重要程度,是Precision和Recall的加權調(diào)和平均[13],是最重要的一個評估指標。F_measure可通過如下公式計算
(3)
其中,β是參數(shù)。當0<β<1時,精準率有更大的影響,當β>1時,召回率有更大的影響。在本文的異常檢測方法中,既要保證非異常不能檢測成異常(精準率),又要保證異常不能檢測為非異常(召回率)。假設Precision和Recall的權重的相同的,即β=1, 式(3)可表示為
(4)
本文實驗使用Python語言進行LogCluster方法以及SW-LogCluster方法的實現(xiàn),實驗日志數(shù)據(jù)采用了HDFS和BGL(BlueGene/L)日志集[14]。每個實驗分別進行20次,并對實驗結果評估指標取平均值。
接下來,我們首先使用SW-LogCluster和LogCluster方法對帶標記符的日志(HDFS)進行對比實驗,然后再驗證SW-LogCluster日志檢測方法在不帶標記符的日志(BGL)上的檢測效果。通過兩組實驗驗證SW-LogCluster方法是否有效擴展了原方法的適用性。最后驗證了滑動窗口屬性對SW-LogCluster方法的影響,并討論窗口大小和步長對SW-LogCluster方法產(chǎn)生的影響。
實驗采用50萬條的HDFS日志的樣本數(shù)據(jù),分別使用LogCluster方法和SW-LogCluster方法進行異常檢測的平均Precision、Recall和F_measure結果如圖7所示。
圖7 LogCluster和SW-LogCluster在精確率、召回率和F_measure方面的實驗結果對比
圖7展示了各項指標(Precision,Recall,F(xiàn)_measure)在使用LogCluster和SW-LogCluster方法時的平均值。由圖7我們可以看出,SW-LogCluster方法在Precision和 F_measure 兩項指標上比LogCluster方法略小,但是在 Recall 指標上稍大。SW-LogCluster方法的3項指標與LogCluster方法相差不多。實驗結果表明SW-LogCluster方法在帶有標記的日志(HDFS)上基本能達到LogCluster方法的異常檢測效果。
本實驗通過使用SW-LogCluster方法對不同規(guī)模BGL日志集進行異常檢測,以此來驗證SW-LogCluster方法在Precision、Recall和F_measure這3項指標上的實驗效果。
圖8展示了各項指標(Precision,Recall,F(xiàn)_measure)在不同日志樣本集規(guī)模(50萬條,100萬條,200萬條和400萬條)時的平均值。由圖8我們可以看出,隨著日志樣本集的不斷變大,3項指標均有略微的提高,并且維持在一個較為穩(wěn)定的區(qū)間。3項指標的值與LogCluster方法在HDFS日志上的實驗結果基本相同。實驗結果表明SW-LogCluster在不帶標記符的日志(BGL)上依然能達到LogCluster的異常檢測效果。
圖8 SW-LogCluster測試結果
結合第4.1節(jié)進行的實驗,改進后的SW-LogCluster方法不僅能達到原方法異常檢測的效果,而且在檢測不帶標記符的日志類型時也能達到理想的檢測結果,說明改進后的方法有效擴展了原方法的適用性。
本實驗將研究滑動窗口中窗口大小和步長對SW-LogCluster異常檢測方法精度的影響。實驗選取50萬條的BGL日志數(shù)據(jù)作為樣本數(shù)據(jù)。實驗結果解釋如下。
圖9展示了不同窗口大小對F_measure值的影響。在該實驗中,步長設為1 h。由這幅圖我們可以看出,隨著窗口大小的不斷增大,異常檢測的綜合指標F_measure的值越來越大。這是因為在一定范圍內(nèi),窗口越大就可以覆蓋越多的信息,能減少一些小窗口覆蓋信息不完全的情況,提升日志序列劃分效果,進而發(fā)現(xiàn)更準確的異常檢測模式。實驗結果表明,當步長固定時,窗口越大,異常檢測的效果越好。
圖9 窗口大小對檢測精度的影響
圖10展示了不同步長對F_measure值的影響。在該實驗中,窗口大小保持在6 h。由這幅圖我們可以看出,隨著步長的變化,F(xiàn)_measure的值基本保持不變。這是因為步長的大小對窗口覆蓋信息完不完整沒有必然的聯(lián)系。實驗結果表明,當窗口大小固定時,步長大小對異常檢測的結果沒有影響。
圖10 步長對檢測精度的影響
本文針對LogCluster方法處理日志類型單一的問題,提出了一種改進的基于日志的異常檢測方法SW-LogCluster,SW-LogCluster方法使用滑動窗口的方法代替會話窗口對日志進行劃分,能夠?qū)⒏囝愋偷娜罩緞澐譃槿罩拘蛄?,方法的適用性得到擴展。本文對SW-LogCluster方法進行了設計實現(xiàn)和實驗驗證,結果表明,SW-LogCluster方法的3項評估指標(Precision,Recall,F(xiàn)_measure)與LogCluster方法相差不大,說明SW-LogCluster方法在保證異常檢測效果的基礎上,有效擴展了原方法的適用性。