張林棟 魯 燃 劉培玉
(山東師范大學(xué)信息科學(xué)與工程學(xué)院 山東 濟南 250014)(山東省分布式計算機軟件新技術(shù)重點實驗室 山東 濟南 250014)
系統(tǒng)日志異常檢測是計算機系統(tǒng)必不可少的任務(wù)。系統(tǒng)日志記錄了系統(tǒng)狀態(tài)和不同臨界點上的事件,可以用來幫助技術(shù)人員調(diào)試機器性能和檢測系統(tǒng)故障等問題,也是檢測系統(tǒng)是否異常的重要數(shù)據(jù)。系統(tǒng)日志異常檢測最早開始于人工檢測,但是人工檢測僅限于日志數(shù)據(jù)較少的環(huán)境,很難應(yīng)用于大數(shù)據(jù)的環(huán)境下。
Xu等[1]提出了一種統(tǒng)計分析的方法,捕獲單一類型消息的發(fā)生頻率來進(jìn)行異常檢測,但是異常行為通常由復(fù)雜的若干個軟件組成,只進(jìn)行單一類型的異常檢測是遠(yuǎn)遠(yuǎn)不夠的。Yamanishi等[2]提出了一種基于機器學(xué)習(xí)的方法來檢測日志消息之間的相關(guān)性,解決了基于統(tǒng)計分析方法中不能對復(fù)雜系統(tǒng)異常檢測的問題。但是隨著系統(tǒng)的變化,該方法并不能很好地適應(yīng)新的日志模式。因此越來越多的學(xué)者開始利用神經(jīng)網(wǎng)絡(luò)進(jìn)行系統(tǒng)異常檢測。
Brown等[3]運用自然語言處理的知識,提出了一種基于遞歸神經(jīng)網(wǎng)絡(luò)(RNN)語言模型,將注意力機制納入到RNN語言模型中。但是RNN所能存取的上下文信息范圍有限,由于其本身的激活函數(shù),在模型訓(xùn)練過程中會產(chǎn)生梯度消失和爆炸的問題,使得隱藏層的輸入對于網(wǎng)絡(luò)輸出的影響隨著網(wǎng)絡(luò)環(huán)路的不斷遞歸而衰退。為了克服RNN的缺點,Du等[4]提出了一種基于深度學(xué)習(xí)的系統(tǒng)日志異常檢測框架Deeplog,利用長短時記憶網(wǎng)絡(luò)(LSTM)對系統(tǒng)日志進(jìn)行異常檢測。與基于機器學(xué)習(xí)的方法[5-7]相比,該方法克服了RNN網(wǎng)絡(luò)的不足,而且具有很高的準(zhǔn)確率,但是由于LSTM網(wǎng)絡(luò)的結(jié)構(gòu)特性,在進(jìn)行異常檢測時只考慮了日志的前序事件對當(dāng)前事件的影響而忽略了后序事件對當(dāng)前事件的影響,使得結(jié)果很難具有說服性。
因此,本文提出基于雙向長短時記憶網(wǎng)絡(luò)的日志路徑異常檢測模型。該模型有效地彌補了LSTM的不足,充分考慮前后事件對當(dāng)前事件的影響。與之前的方法相比,該模型在HDFS和OpenStack數(shù)據(jù)集上準(zhǔn)確率和F-measure都有顯著的提高。
RNN[8]是最早應(yīng)用在時序序列預(yù)測的算法之一,是唯一具有內(nèi)部存儲器的神經(jīng)網(wǎng)絡(luò)算法,能夠廣泛地適用于時間序列、語音、文本、財務(wù)數(shù)據(jù)、音頻、視頻、天氣等時序數(shù)據(jù)的處理。
RNN具有獨特的循環(huán)機制,因此能夠在輸入和輸出序列之間的映射過程中充分利用上下文相關(guān)信息,綜合考慮前序事件和后序事件對當(dāng)前事件的影響。在RNN中,信息只在一個方向上移動。當(dāng)它作出決定時,會考慮當(dāng)前的輸入以及它從之前收到的輸入獲得想要的內(nèi)容。但是RNN也存在著顯著的缺點,在訓(xùn)練時會產(chǎn)生梯度爆炸等問題,并且RNN所能存取的上下文信息范圍非常有限,使得隱藏層的輸入對于網(wǎng)絡(luò)輸出的影響隨著網(wǎng)絡(luò)環(huán)路的不斷遞歸而衰退。
圖1 LSTM框架圖
雙向長短時記憶網(wǎng)絡(luò)(Bi-LSTM)[10]模型如圖2所示,由前向傳播和后向傳播的LSTM網(wǎng)絡(luò)組成。該網(wǎng)絡(luò)結(jié)合了RNN和LSTM的優(yōu)點,既克服了RNN衰退的問題,又能夠利用LSTM網(wǎng)絡(luò)的優(yōu)勢,通過前向推算和后向推算,有效地結(jié)合前后事件對當(dāng)前事件的影響。
圖2 Bi-LSTM網(wǎng)絡(luò)模型
日志路徑異常檢測的框架如圖3所示。首先把正常執(zhí)行的日志文件通過日志解析器提取出對應(yīng)的日志鍵,并將一系列日志鍵建模成為一個時間序列。其次通過Bi-LSTM模型進(jìn)行訓(xùn)練,使模型充分學(xué)習(xí)日志鍵序列執(zhí)行模式。在進(jìn)行檢測時,將新的日志文件使用日志解析器構(gòu)造日志鍵序列,通過Bi-LSTM模型進(jìn)行檢測。若未發(fā)現(xiàn)異常則模型將序列標(biāo)記為正常;若檢測出異常,則將根據(jù)用戶的反饋來判斷是否發(fā)生誤判。如果發(fā)生誤判則通過在線更新優(yōu)化模型參數(shù)的機制,再次通過模型進(jìn)行異常檢測;如果沒有發(fā)生誤判,模型將輸出日志序列標(biāo)記為異常。
圖3 日志路徑異常檢測框架圖
日志解析器[11-13]的目的是將結(jié)構(gòu)不統(tǒng)一的日志數(shù)據(jù)進(jìn)行歸一化處理。通過解析日志文件提取日志鍵構(gòu)造時序序列的方法,將不同結(jié)構(gòu)的日志數(shù)據(jù)轉(zhuǎn)化為具有相同格式時序化日志鍵序列。首先逐行讀取日志數(shù)據(jù),每個日志行都使用一個簡單的正則表達(dá)式進(jìn)行預(yù)處理。其次提取該日志的關(guān)鍵特征構(gòu)造成一個日志鍵,并將每行解析的日志鍵構(gòu)建成一個時序序列。例如,一個日志條目為“Adding an already existing block(10)”,則可以用一個日志鍵k1來代替它,即k1=Adding an already existing block(.*)。其中日志鍵中參數(shù)被抽象為*號。如表1所示,通過日志解析器的日志文件將被解析為一個時序序列,例如{k1,k2,…}。
表1 日志解析實例
將通過日志解析器獲得的日志鍵序列進(jìn)行系統(tǒng)日志異常檢測。假設(shè)K={k1,k2,…,kn}是一個日志塊所轉(zhuǎn)換的日志鍵序列,每一個日志鍵代表某一時刻日志執(zhí)行的路徑命令,整個日志鍵序列反映了日志的順序執(zhí)行路徑。對整個序列進(jìn)行檢測,需要依次檢測每個日志鍵是否為異常。令ki為K序列n個中的某一個,代表著即將檢測的日志鍵。
如圖3所示,采用Bi-LSTM網(wǎng)絡(luò)來進(jìn)行系統(tǒng)日志異常檢測,該網(wǎng)絡(luò)由前向LSTM和反向LSTM網(wǎng)絡(luò)組成,充分考慮了后序事件對前序事件的影響。輸入是幾個連續(xù)的日志鍵,輸出是下一個日志鍵ki的概率。ki的概率由前向傳播和反向傳播得到的概率共同決定的。前向或反向傳播都由一層LSTM網(wǎng)絡(luò)組成。每一塊LSTM都有隱藏狀態(tài)ht-i和細(xì)胞狀態(tài)Ct-i,兩者都被傳遞到下一個塊以初始化其狀態(tài)。目的是通過模型得出當(dāng)前日志鍵ki的概率,然后設(shè)定一個概率界限(參數(shù)g)來判斷當(dāng)前日志鍵是否發(fā)生了異常。通過各個門控的計算最終得出ki的條件概率,與通過訓(xùn)練得出的g進(jìn)行比較,把低于g的日志鍵標(biāo)記為異常。
其前向傳播推算的公式為:
輸入門:
(1)
(2)
遺忘門:
(3)
(4)
輸出門:
(5)
(6)
反向傳播推算的公式為:
輸入門:
(7)
遺忘門:
(8)
輸出門:
(9)
訓(xùn)練階段:在訓(xùn)練階段中使用正常執(zhí)行的日志條目作為數(shù)據(jù)集來訓(xùn)練模型,目的是讓模型充分學(xué)習(xí)到系統(tǒng)日志正常的執(zhí)行模式,盡可能避免出現(xiàn)誤判的情形。通過日志解析器得到一個日志鍵序列,然后給定一個窗口大小h,將日志鍵按窗口的大小、執(zhí)行順序組合成一個時序序列,該序列記為w,例如w={ki-h,ki-h+1,…,ki-1},將w輸入到模型Bi-LSTM網(wǎng)絡(luò)中。例如,假設(shè)一個日志鍵序列為{k11,k23,k5,k9,k12,k25,k3}。給定窗口大小h=4,則用于訓(xùn)練模型的輸入序列和輸出標(biāo)簽為:{k11,k23,k5,k9→k12},{k23,k5,k9,k12→k25},{k5,k9,k12,k25→k3}。通過Bi-LSTM模型得出下一日志鍵ki的條件概率,根據(jù)ki概率分布的范圍,設(shè)置g的參數(shù)大小。
檢測階段:基本方法跟訓(xùn)練階段相同,對于新加入的日志條目首先通過日志解析器構(gòu)造成日志鍵序列w。將w輸入到Bi-LSTM模型中得出當(dāng)前日志鍵的條件概率,通過與設(shè)置的參數(shù)g進(jìn)行對比,把高于設(shè)置的g值的ki標(biāo)記為正常;若得到的ki概率值低于g值,那么模型將把該結(jié)果反饋給用戶,用戶判斷是否發(fā)生了誤判,如果發(fā)生了誤判,則通過在線更新機制調(diào)整模型參數(shù),將得出的日志鍵與實際的日志鍵設(shè)為相同的概率,如果沒有發(fā)生誤判則直接將該序列標(biāo)記為異常。
異常檢測模型如圖4所示。為了檢測一個新的日志鍵ki是正常還是異常的,把窗口大小為h的日志鍵序列w作為輸入,輸出是給定輸入日志鍵序列的下一個日志鍵ki的條件概率。通過將得出的條件概率Pr與參數(shù)g進(jìn)行比較,判斷日志執(zhí)行路徑是否發(fā)生了異常。
圖4 異常檢測模型圖
語言模型:把日志執(zhí)行路徑作為時序序列處理,其原理是應(yīng)用自然語言處理的語言模型。在訓(xùn)練模型時,把每個日志鍵都可以看作是從詞匯表K中提取的一個單詞,應(yīng)用自然語言處理的語言模型來計算該詞出現(xiàn)的概率,從而判斷系統(tǒng)是否發(fā)生異常。近年來,使用神經(jīng)網(wǎng)絡(luò)的神經(jīng)概率語言模型(NPLM)[14]已被證明在自然語言處理任務(wù)中非常有效。因此在Bi-LSTM中使用了NPLM語言模型來對日志鍵序列進(jìn)行異常檢測。NPLM語言模型沿用了傳統(tǒng)的N-gram模型[15]中的思路,認(rèn)為目標(biāo)詞wt的條件概率與其之前的n-1個詞有關(guān)。但與N-gram模型區(qū)別是在計算P(wt|w1,w2,…,wt-1)時,其使用了機器學(xué)習(xí)的方法,很好地解決了給定一個日志鍵序列如何最大化地計算日志鍵ki概率的問題。NPLM語言模型的計算公式為:
p(w|context(w))=k(iw,Vcontext)
(10)
式中:k表示神經(jīng)網(wǎng)絡(luò);iw為w在詞匯表中的序號;context(w)為w的上下文;Vcontext為上下文構(gòu)成的特征向量。
如何保證檢測模型的時效性、如何解決日志新的執(zhí)行模式等,是系統(tǒng)異常檢測必須要解決的問題,因此在模型中加入了用戶反饋在線更新的機制。隨著工作量以及工作方式的變化,用戶可以在線優(yōu)化模型的參數(shù)。例如:檢測時可能會出現(xiàn)誤報的情況,假設(shè)一個窗口大小h=4日志鍵序列為{k22,k16,k5,k6},已知訓(xùn)練后,模型已經(jīng)將概率為1的下一個日志鍵預(yù)測是k7,而實際序列中的日志鍵是k3,那么模型將把k3標(biāo)記為異常。如果用戶反饋這是誤報(實際情況下k7和k3都是正常的日志鍵),模型就可以根據(jù)用戶的反饋優(yōu)化新的權(quán)重來學(xué)習(xí)這個新序列。當(dāng)再次輸入該序列時,檢測到的k7和k3都將會得到相同的概率且被標(biāo)記為正常。
主成分分析法(PCA)[16]是一種基于降維的統(tǒng)計方法。在進(jìn)行異常檢測的時候,PCA根據(jù)每個日志事件的標(biāo)識符進(jìn)行分組,然后記錄每組中每個日志事件出現(xiàn)的次數(shù)。PCA的基本思想是將高維數(shù)據(jù)投影到由k個維度組成的新坐標(biāo)系中,通過測量坐標(biāo)系的子空間上的投影長度來檢測異常。因此,PCA可以保留原始高維數(shù)據(jù)的主要特征。
Xu等[17]首先將PCA應(yīng)用在的異常檢測中。在Xu等的方法中,每個日志序列被轉(zhuǎn)化為日志事件的計數(shù)向量,使用PCA構(gòu)造成兩個子空間,正??臻gSn和Sm異??臻g。然后,計算事件計數(shù)向量y到Sm的投影,如果超過閾值,則對應(yīng)的日志事件將被標(biāo)記為異常。
Lou等[18]最先將不變量挖掘(IM)的方法應(yīng)用到系統(tǒng)日志異常檢測中。IM根據(jù)日志參數(shù)之間的關(guān)系將日志消息進(jìn)行分組,從日志消息組中自動地獲取程序不變量。程序不變量在系統(tǒng)運行期間始終保持線性關(guān)系,其輸入是從日志序列生成的事件計數(shù)矩陣,其中每一行是事件計數(shù)向量。首先,使用奇異值分解來估計不變空間的不變量r;其次,通過強力搜索算法找出不變量;最后,通過與設(shè)定的閾值進(jìn)行比較來驗證挖掘的不變量。重復(fù)執(zhí)行以上步驟,直至獲得r個獨立不變量。在檢測時,對新的日志序列進(jìn)行判斷是否符合不變量,如果至少有一個不符合,則日志序列將被報告為異常。
實驗采用系統(tǒng)日志異常檢測中通用的權(quán)威數(shù)據(jù)集,一是Xu等[17]所公開的HDFS日志數(shù)據(jù)集,另一個是Du等[4]在Deeplog中公開的OpenStack數(shù)據(jù)集。
HDFS數(shù)據(jù)集是基于PCA的主要數(shù)據(jù)集,并在在線PCA和基于IM的異常檢測方法中廣泛應(yīng)用。該數(shù)據(jù)集包含了11 197 954個日志條目,其中約3%是異常的。通過標(biāo)識符字段將日志條目分組到不同會話中,HDFS的標(biāo)識符為block_id,每組會話對應(yīng)著一個日志塊。
OpenStack數(shù)據(jù)集包含1 333 318個日志條目,約7%是異常的。主要的進(jìn)程包括VM的創(chuàng)建/刪除、停止/啟動、暫停/恢復(fù)等。OpenStack數(shù)據(jù)集的標(biāo)識符為instance_id。分別將每個日志條目通過解析器轉(zhuǎn)化為日志鍵,然后通過Bi-LSTM網(wǎng)絡(luò)來訓(xùn)練其權(quán)重,進(jìn)行異常檢測。
為了評估模型的有效性,本文采用Precision(召回率)、Recall(準(zhǔn)確率)和F-measure作為評價標(biāo)準(zhǔn)。Precision為所有檢測到的異常與真正異常的百分比[19]。Recall反映了被正確判定的正常樣本占總的正常樣本的百分比。設(shè)置參數(shù)g決定了得到下一日志鍵概率判斷為異常的最低概率值。F-measure的值同時受到Precision、Recall的影響。設(shè)置默認(rèn)輸入窗口h的大小為10,一個LSTM網(wǎng)絡(luò)塊的存儲單元α的個數(shù)為64。為了檢測模型的性能,做了三組對比實驗:首先比較該模型與之前的基于機器學(xué)習(xí)的方法的性能;其次通過調(diào)整參數(shù)g、h、α、Pr的大小來對模型參數(shù)進(jìn)行實驗分析;最后進(jìn)行模型有在線更新機制與無在線更新機制的對比實驗。
(11)
(12)
(13)
式中:TP為將正常樣本預(yù)測為正常類數(shù);FN為將正常樣本預(yù)測為異常類數(shù);FP為將異常樣本預(yù)測為正常類數(shù);TN為將異常樣本預(yù)測為異常類數(shù)。
表2為HDFS數(shù)據(jù)上每種方法的假陽性和假陰性的數(shù)目。PCA實現(xiàn)了最少的假陽性,但是具有很高的假陰性。IM假陽性和假陰性都很高;Bi-LSTM的假陰性和假陽性都具有較低的水平。
表2 HDFS數(shù)據(jù)集FP和FN的數(shù)量
3.4.1方法對比分析
圖5和圖6分別為HDFS和OpenStack數(shù)據(jù)集上不同方法對比實驗結(jié)果。雖然傳統(tǒng)的PCA在HDFS數(shù)據(jù)集上的準(zhǔn)確率為0.98,但是F-measure值僅有0.79,OpenStack數(shù)據(jù)集上也并未表現(xiàn)出突出的性能。而IM盡管在HDFS數(shù)據(jù)集上表現(xiàn)出良好的性能,而在OpenStack數(shù)據(jù)集上準(zhǔn)確率和F-measure分別為0.02和0.04。由此可以得出:傳統(tǒng)的基于機器學(xué)習(xí)的檢測方法并不具有很好的適用性,不能有效地應(yīng)用到不同系統(tǒng)之間的異常檢測。使用LSTM的檢測方法的Deeplog模型準(zhǔn)確率和F-measure都高達(dá)0.95以上?;贐i-LSTM的方法在兩個數(shù)據(jù)集上都表現(xiàn)出良好的性能,準(zhǔn)確率和F-measure分別為0.98和0.98。這是由于Bi-LSTM綜合考慮前后事件對當(dāng)前事件的影響,因此實驗結(jié)果高于Deeplog模型。通過對比實驗可以得出:Bi-LSTM模型不僅能夠適用于隨機生成的數(shù)據(jù)集而且在大規(guī)模的數(shù)據(jù)上也表現(xiàn)出優(yōu)越的性能,能夠適用于不同系統(tǒng)日志路徑的異常檢測。
圖5 HDFS數(shù)據(jù)集性能對比結(jié)果圖
圖6 OpenStack數(shù)據(jù)集性能對比結(jié)果圖
3.4.2Bi-LSTM模型參數(shù)分析
通過調(diào)整Bi-LSTM網(wǎng)絡(luò)中各種參數(shù)來測試模型的性能,其中調(diào)整的參數(shù)包括:g,h,α,Pr。在每個實驗中只改變一個參數(shù)的值,其余參數(shù)保持默認(rèn)值。圖7為改變參數(shù)α,其他參數(shù)不變的情況下的模型性能隨著LSTM單元個數(shù)的變化趨勢,實驗表明當(dāng)內(nèi)存單元數(shù)為192時,模型的準(zhǔn)確率和F-measure都明顯優(yōu)于其他內(nèi)存單元數(shù)。圖8反映了改變參數(shù)g后模型的性能變化,當(dāng)設(shè)置的g閾值偏低時,雖然模型具有很高的準(zhǔn)確率但是其F-measure卻很低。圖9為改變參數(shù)h模型的性能變化,由于LSTM網(wǎng)絡(luò)需要長依賴性,所以當(dāng)選擇的窗口越大時,其表現(xiàn)的性能越明顯。圖10反映了改變參數(shù)Pr后模型的性能變化,Pr的大小決定著前向推算和后向推算各自對預(yù)測的概率所占的比重。綜合所有的實驗結(jié)果,發(fā)現(xiàn)Bi-LSTM網(wǎng)絡(luò)的性能在調(diào)整各個參數(shù)時表現(xiàn)得非常穩(wěn)定,單一改變參數(shù)或者是組合調(diào)整對模型的性能影響不大。
圖7 改變參數(shù)α性能對比結(jié)果圖
圖8 改變參數(shù)g性能對比結(jié)果圖
圖9 改變參數(shù)h性能對比結(jié)果圖
圖10 改變參數(shù)Pr性能對比結(jié)果圖
3.4.3在線更新對模型性能的分析
在HDFS和OpenStack兩個數(shù)據(jù)集中,許多日志鍵僅在特定時間段內(nèi)出現(xiàn),因此訓(xùn)練數(shù)據(jù)集可能不包含所有正常日志鍵,具有很好的未知性。首先,用數(shù)據(jù)集的前10%作為訓(xùn)練數(shù)據(jù),其余的作為測試數(shù)據(jù)。然后,設(shè)置各個參數(shù)α=64、g=0.8、h=10、Pr=0.5,并保證參數(shù)不改變。對于有在線更新的模型,假設(shè)有用戶報告檢測到的異常為誤報,Bi-LSTM使用該標(biāo)記來更新其模型以學(xué)習(xí)這種新模式。圖11是模型在HDFS數(shù)據(jù)集下的性能,無在線更新的模型準(zhǔn)確率僅為0.30,F(xiàn)-measure為0.46,而有在線更新的模型準(zhǔn)確率和F-measure分別為0.90和0.95。圖12是模型在OpenStack數(shù)據(jù)集下的性能,無在線更新的模型準(zhǔn)確率僅為0.35,F(xiàn)-measure為0.52,而有在線更新的模型準(zhǔn)確率和F-measure分別為0.93和0.96。結(jié)果表明,有在線更新的異常檢測模型在準(zhǔn)確率和F-measure都明顯高于無在線更新模型,在線更新的機制可以提高模型在檢測新執(zhí)行模式時的性能。
圖11 HDFS數(shù)據(jù)集有無在線更新性能比較圖
圖12 OpenStack數(shù)據(jù)集有無在線更新性能比較圖
本文提出一種基于雙向長短時記憶網(wǎng)絡(luò)的系統(tǒng)異常檢測模型。首先在每個日志條目的級別上,通過日志解析器實現(xiàn)從日志文件中分離出不同類別的任務(wù),從而構(gòu)成時序化的日志鍵序列,有效地解決傳統(tǒng)異常檢測方法中日志結(jié)構(gòu)不統(tǒng)一的問題。其次使用雙向長短時記憶網(wǎng)絡(luò)對時序化的日志序列進(jìn)行建模和預(yù)測,并且增加在線更新優(yōu)化模型參數(shù)的機制,提高模型檢測新執(zhí)行模式的性能。實驗結(jié)果表明,與傳統(tǒng)的基于機器學(xué)習(xí)異常檢測的方法相比,本文模型在HDFS和OpenStack數(shù)據(jù)集上準(zhǔn)確率分別提升了0.11和0.2,召回率提升了0.29,F(xiàn)-measure分別提升了0.19和0.11?;陔p向長短時記憶網(wǎng)絡(luò)的系統(tǒng)異常檢測模型在系統(tǒng)日志異常檢測上具有顯著的性能,對系統(tǒng)異常檢測和優(yōu)化模型參數(shù)等方面具有重要的意義。
在未來工作中,將改進(jìn)模型使其不僅能適用于系統(tǒng)日志執(zhí)行模式的異常檢測,還能夠?qū)θ罩局械母鱾€參數(shù)進(jìn)行異常檢測。同時改進(jìn)模型的輸出最大化概率的最優(yōu)路徑來提升模型的效率。