劉洪歧,陳遠平,馬建化
1(中國科學(xué)院 計算機網(wǎng)絡(luò)信息中心,北京 100190)2(中國科學(xué)院大學(xué),北京 100190)
3(福建省龍巖煙草工業(yè)有限責(zé)任公司,龍巖 364021)
系統(tǒng)日志(syslog)是應(yīng)用系統(tǒng)記錄的,蘊含著大量的信息,可以記錄系統(tǒng)已經(jīng)發(fā)生的行為,并按照某種規(guī)范表達出來.Syslog可以用于系統(tǒng)異常的診斷、建立系統(tǒng)工作流程等,然而直接針對海量的非結(jié)構(gòu)化日志進行分析計算是不可行,應(yīng)對其做適當(dāng)?shù)奶幚?以加快后續(xù)的分析效率.現(xiàn)有研究工作證明,提取日志模板是十分有效的日志處理方法,很多日志分析的相關(guān)研究都是依賴于日志模板的.其相關(guān)概念最初是由許巍[1]在其有關(guān)于日志分析的文章中提到的,一條日志模板可以代表一類系統(tǒng)事件,一個系統(tǒng)產(chǎn)生的海量日志數(shù)據(jù)都是由少數(shù)的日志模板擴展出來的,日志模板的提取工作是進行其他日志分析工作的基礎(chǔ),是十分重要且有研究意義的.日志記錄通常由常量和變量組成,也可稱為模板詞和參數(shù)詞,提取日志模板的工作就是提取其中的模板詞,構(gòu)建模板.日志模板通常為程序中的print定義的語句,因此基于程序源碼解析的日志模板提取方法被廣泛的使用,該方法一般是通過構(gòu)建程序的抽象語法樹AST,獲取日志輸出的相關(guān)語句來實現(xiàn)的.但對于大型系統(tǒng),通常包含第三方軟件維護的日志,因此通過源碼解析的方式提取日志模板的適應(yīng)性較差,且需要具有相關(guān)的領(lǐng)域知識[2],因此本文采用只針對于日志文件的日志模板提取方法.考慮到已有的實驗證明基于標(biāo)簽識別樹的方法在準(zhǔn)確度和可應(yīng)用性上都明顯優(yōu)于該領(lǐng)域其余兩種常見算法Statistical Templete Extraction (STE)[3]和LogSim-ilarity[4],因此本文選擇基于標(biāo)簽識別樹的模板提取方法作為具體方法.該方法應(yīng)用于實際數(shù)據(jù)中存在諸多難點:一是如何對自由形式文本的syslog[5,6]進行預(yù)處理,使其適合于后續(xù)基于標(biāo)簽識別樹的模板提取算法;二是如何在現(xiàn)有模板提取算法的基礎(chǔ)上完善模板表達式生成方法,并提高模板匹配度.為解決上述問題,在對syslog本身特點和現(xiàn)有領(lǐng)域方法作充分研究后,本文采用了基于文本相似度的方法對原始日志進行預(yù)處理,并采用模板最大匹配的方法完善了模板表達式生成.實驗證明,本次采用的日志模板提取方法具有較高的準(zhǔn)確度和模板匹配度.
系統(tǒng)日志可以記錄下系統(tǒng)所產(chǎn)生的所有行為,并按照某種規(guī)范表達出來.系統(tǒng)日志在安全、信息統(tǒng)計、調(diào)試等領(lǐng)域有很重要的作用.系統(tǒng)日志可以分為操作系統(tǒng)日志、應(yīng)用系統(tǒng)日志、安全系統(tǒng)日志等等,由于其服務(wù)類型和日志管理方法的不同,其日志文本形式及其語義語法也存在很大區(qū)別.以Java 應(yīng)用系統(tǒng)日志為例,它有多種可選的日志操作插件,常見的有l(wèi)og4j、slf4j、logback 等,對于大型的 web 應(yīng)用,不同功能的日志生成通常是由不同人員管理的,且通常會含有第三方插件管理的日志模塊,因此日志格式是不統(tǒng)一的.以使用log4j格式的某Web應(yīng)用的系統(tǒng)日志為例,除開發(fā)人員代碼中指定的輸出內(nèi)容外,還有多個可選的打印參數(shù),如日志優(yōu)先級、日志輸出時間、日志所屬時間線程等.表1展示了日志優(yōu)先級為INFO的不同格式的系統(tǒng)日志.
表1 優(yōu)先級為INFO的系統(tǒng)日志
由表1可見日志的文本形式是復(fù)雜多樣的,要覆蓋所有日志格式情況,提取出用戶關(guān)心的內(nèi)容,需要提前了解日志結(jié)構(gòu),本文使用正則表達式的方法將日志內(nèi)容從每條日志記錄中分割出來.提取表1中日志詳細內(nèi)容的對應(yīng)正則表達式集合如表2所示.
表2 提取日志內(nèi)容正則表達式
日志中的詳細信息一般是由模板詞和參數(shù)詞兩部分組成的,模板詞內(nèi)容不隨輸出時所處的運行狀態(tài)而改變,參數(shù)詞則會根據(jù)輸出時程序的運行狀態(tài)進行動態(tài)改變,日志模板可以表征一類系統(tǒng)事件.雖然日志數(shù)據(jù)是海量的,但對應(yīng)的日志模板通常是很少的,提取日志模板,可以從海量的數(shù)據(jù)中歸類出少數(shù)的系統(tǒng)運行事件,能夠十分有效的縮減日志分析的維度,幫助用戶更好的理解系統(tǒng)行為.
基于標(biāo)簽識別樹的日志模板提取方法關(guān)注的重點是從每一消息類型中提取子類型,消息類型可以理解為一組消息特征相近的日志記錄,例如“某服務(wù)的狀態(tài)信息”,“數(shù)據(jù)的某種操作”等,雖然這些大的消息類型也可以表征一類日志事件,但以此來做日志模板的粒度過大,假設(shè)“服務(wù)”和“操作”的取值范圍很小時,將消息類型繼續(xù)細分為“具體服務(wù)的狀態(tài)”和“數(shù)據(jù)的具體操作”這些子類型,將可以幫助用戶更好的理解系統(tǒng)運行的過程.日志消息是由模板詞和參數(shù)詞構(gòu)成的,考慮到海量日志消息的都是由多個消息類型分別改動少數(shù)的參數(shù)詞擴展而來的,因此屬于同一消息類型的眾多日志消息間的文本變動是很小的,應(yīng)該具有很高的文本相似度,而屬于不同消息類型的日志記錄其之間的模板詞和參數(shù)詞都是大不相同的,因此彼此之間的文本相似度是很低的.只有先將海量日志消息進行初步的消息分類,才能通過基于標(biāo)簽識別樹的方法進一步提取日志模板.本文采用基于Edit Distance (文本編輯距離)來衡量日志消息的相似度,該方法僅在字面層面上進行文本比較[7],其原理簡單且易于實現(xiàn).
設(shè)SA、SB為兩個不同的字符串A、B,A、B之間的文本編輯距離即為由SA轉(zhuǎn)換到SB所需要的最少的編輯操作次數(shù),可選的操作類型有刪除、插入、替換3種.假設(shè)計算得到的A、B的編輯距離為Dis(SA,SB),A與B的字符串長度分別為Len(SA)、Len(SB),則A、B之間的文本相似度
Sim(SA,SB)的值越大,則A,B間的文本相似度越高.
海量日志中包含的日志模板數(shù)是未知的,要對其進行基于Edit Distance的分類,需要提前確定參照日志.本文使用日志記錄中的第一行日志內(nèi)容作為基準(zhǔn),計算其與剩余日志數(shù)據(jù)的文本相似度,將結(jié)果大于閾值的記錄從原數(shù)據(jù)集中歸類并分離出來,對剩余的日志數(shù)據(jù)集如此重復(fù)迭代計算,直到數(shù)據(jù)集為空為止.這樣就能把離線海量的日志數(shù)據(jù)高效的分類出來.完整的日志預(yù)處理流程如圖1所示,假設(shè)文本相似度閾值為τ.
基于標(biāo)簽識別樹的模板提取方法主要關(guān)注從每一消息類型中繼續(xù)細分出子模板,它的計算思想來源于關(guān)聯(lián)規(guī)則中的FP-Growth算法[8],該算法具有較高的計算效率,且支持?jǐn)?shù)據(jù)的增量更新.該方法針對上一步日志預(yù)處理后得到的日志消息類型簇,分別提取其子類型模板.同一消息類型中的日志消息彼此間的文本相似度是很高的,無法繼續(xù)通過文本相似度來區(qū)分子類型,但是同一消息類型中屬于子模板詞的部分應(yīng)該是高頻出現(xiàn)的單詞組合,且可變化范圍較小,參數(shù)詞則出現(xiàn)頻率較低且變化范圍廣,這種算法思想正可以映射為FP-Growth算法中的頻繁項計算,支持度高的單詞組合可以視為子模板詞組.現(xiàn)有的基于標(biāo)簽識別樹的模板提取算法主要有模板樹的構(gòu)建和模板樹的剪枝兩個步驟,通過這兩個步驟可從每一消息類型中分類出具體的子模板詞組.然而要使海量日志數(shù)據(jù)能夠精確匹配日志模板,需通過提取的模板詞組進一步生成模板表達式.因此本文在原算法的基礎(chǔ)上重點針對由于日志格式多樣性及文本切詞方法等導(dǎo)致的模板匹配度低的問題進行了算法改進,大幅提升了日志模板匹配度.下面詳細介紹本文采用的日志模板提取方法中的3個步驟:模板樹的構(gòu)建、模板樹的剪枝和模板表達式的生成.
圖1 離線日志預(yù)處理流程圖
模板樹的建樹過程主要有3個步驟:
(1)切詞:確定特定分隔符,以此將每條日志記錄分割為若干個單詞;
(2)計算詞頻:統(tǒng)計在該數(shù)據(jù)集中每個單詞的出現(xiàn)次數(shù);
(3)按詞頻建樹:將每條日志中的單詞按詞頻從大到小依次排列,以“Root”為根節(jié)點,以單詞作為其余節(jié)點建FP-Tree;
在原算法中,簡單將空格作為分隔符,這種方法對于僅以空格分割的特定格式的日志是有效的,然而對于多人員開發(fā)的日志系統(tǒng),其日志格式是復(fù)雜的,不能完全滿足這種特定格式,單以空格作為分隔符,會導(dǎo)致切詞的粒度過大,計算的準(zhǔn)確率下降.因此本文針對待處理日志本身特點,依據(jù)需要增加分隔符,改進切詞粒度過大的問題.以表3所示的日志記錄為例,使用“ ”、“:”、“;”作為分隔符執(zhí)行模板樹的構(gòu)建,構(gòu)建模板樹如圖2所示.
表3 模板構(gòu)建實例
圖2 日志模板樹
對于每組日志類型,應(yīng)當(dāng)只有很少數(shù)量的子類型,而每種類型的參數(shù)形式可以是多樣的.對應(yīng)于日志模板樹,分支較少的節(jié)點應(yīng)為子類型的模板詞,若一個節(jié)點的分支數(shù)較多,則該節(jié)點的孩子節(jié)點很大概率屬于參數(shù)詞,因此,該算法中對于構(gòu)建樹中孩子節(jié)點數(shù)超過設(shè)定閾值k的節(jié)點,將其所有的子孫節(jié)點去除,將該節(jié)點作為模板樹的葉子節(jié)點,剪枝后的模板樹從根節(jié)點到樹中葉子節(jié)點的每條路徑則為子類型模板.如圖2中所建的樹,對“參與者”節(jié)點的子孫節(jié)點進行剪枝,剩余節(jié)點生成的模板組合為“流程實例id、工作項id、參與者”,為子類型模板所包含的關(guān)鍵字.
初始獲得的子類型模板的單詞組合是亂序的,要將原始的日志對應(yīng)于日志模板,需要生成模板的正則表達式.本文采用將獲得的單詞組合一一對應(yīng)于所屬的原始日志的方式生成日志模板,注意作為分隔符的字符是不參與對比的,會在日志模板中以原字符表示,剩余單詞如果屬于日志模板則以原字符表示,否則以任意字符最小匹配的方式——如java中以“.*?”表示.上例中日志索引[1,2,3,4,5,6,7,8,9]都包含模板單詞組合“流程實例id、工作項id、參與者”,選取其中一條日志(如日志索引1),按照如上方法,可生成日志模板表達式:“流程實例 id:.*?;工作項 id:.*?;參與者:.*?.*?.*?”.
可以發(fā)現(xiàn)該模板是不合理的,因為它不能使屬于同一模板的所有日志完全與之匹配,觀察模板樹可以發(fā)現(xiàn)這是由于日志格式不統(tǒng)一和切詞導(dǎo)致的.要獲得更通用的模板表達式,要將分隔符對連續(xù)參數(shù)組合的影響程度最小,即參數(shù)個數(shù)盡可能少,反映到初始建立的模板樹上,應(yīng)當(dāng)選取所屬日志中單詞個數(shù)最少的原始日志作為生成模板表達式的參考文本.上例中應(yīng)該選取日志索引3,對應(yīng)生成的模板表達式為:“流程實例id:.*?;工作項id:.*?;參與者:.*?”,它可使屬于同一模板的日志與之完全匹配.
日志模板提取的完整算法結(jié)構(gòu)如下所示:
算法1.日志模板提取算法輸入:歸類的一組日志數(shù)據(jù)集DM={M1,M2,…,Mn}、分隔符集合Sep、剪枝閾值k.輸出:日志模板表達式.1 Divide each log from DM into a collection of words with separators in Sep 2 Scan the message set DM once.3 Calculate the support for each word I in DM,let L=map(I,I.support)4 Create new FP-tree T and the root of T “Root 5 Creat ModelList 6 for each message in DM do 7 Sort its words according to their order in L 8 Let the sorted word list be [p|P],p is the first word in P 9 for each word in P do 10 Call insertNode(p)11 end for 12 end for 13 for child C in T do 14 if C.child.length > k 15 Delete all the children of C 16 Let the path form C to Root be the list model={Node1,Node2,…,Noden}17 form the list∈DM that contain C choose Mi that has the Minimum number of words 18 for word in Mi do 19 If word model 20 Replace the word with.?*21 end if 22 end for 23 ModelList.add(Mi)images/BZ_247_469_2846_490_2880.png
24 end if 25 end for 26 Return ModelList
本文使用中國科學(xué)院某大型分布式信息管理Web系統(tǒng)產(chǎn)生的58萬條Apach服務(wù)器真實日志記錄作為數(shù)據(jù)集,使用如上方法進行了日志模板的提取.實驗以Windows系統(tǒng)為實驗平臺,Java為程序設(shè)計語言,MySQL為數(shù)據(jù)庫進行開發(fā).
隨機選取數(shù)據(jù)集中的兩萬條日志記錄,計算其與剩余記錄的文本相似度值,圖3為其關(guān)系折線圖.從圖中可以看出,文本的相似度值從某一點開始驟然下降至非常小的數(shù)值,分析可得該點以后的數(shù)據(jù)可視為與參考日志屬于不同消息類型.在對大量日志計算轉(zhuǎn)折點后,發(fā)現(xiàn)將文本相似度閾值取為0.3較為合適.對于模板剪枝閾值的選取,k值過大,會提取出多余不必要的日志模板,k值過小則會將本不屬于同類的多個子類型歸為一類事件.多次實驗證明針對本文的數(shù)據(jù)集k取5具有較高準(zhǔn)確性,但隨這數(shù)據(jù)集內(nèi)容的增加,k可能需要依實際情況增大取值.
圖3 文本相似度折線圖
本次實驗從58萬條Apache服務(wù)器真實日志數(shù)據(jù)中提取了551條日志模板,數(shù)據(jù)源所屬Web應(yīng)用的開發(fā)人員對于日志消息的分類是十分熟悉的,具有高可信度,通過開發(fā)人員對日志的手動分類,獲得真實的日志模板.本文采用Rand index方法進行評估,Rand index[9]方法可用于評估兩種數(shù)據(jù)聚類方法之間的相似性,將開發(fā)人員手動分類的日志模板與實驗提取的模板作為Rand index算法的輸入進行計算,以此來評估本次實驗的準(zhǔn)確度.評估的具體方法為,從原數(shù)據(jù)集中預(yù)先隨機抽取100條數(shù)據(jù),重復(fù)在這100條數(shù)據(jù)中隨機抽取兩條x和y,定義4個評價指標(biāo)A、B、C、D如下:
A:x和y被手動分為一類且實驗也被歸為一類.
B:x和y被手動分為不同類且實驗也被分為不同類.
C:x和y被手動分為不同類但實驗被歸為一類.
D:x和y被手動分為一類但實驗被分為不同類.
使用上述指標(biāo),Rand index定義為:實驗隨機抽取了10個數(shù)據(jù)組進行實驗,計算Rand index值,實驗結(jié)果如圖4所示.
圖4 結(jié)果Rand index計算結(jié)果
本實驗提取日志模板的準(zhǔn)確率平均值達到了96.4%,證明基于標(biāo)簽識別樹的日志模板提取方法具有較高的可信度和穩(wěn)定性.此外,將實驗數(shù)據(jù)集與提取的模板表達式進行正則匹配,匹配度為100%,證明本文采用的模板表達式的生成方法是合理有效的.
本文實現(xiàn)了基于歷史日志文件的日志模板提取方法.首先根據(jù)日志文本特性,從原始日志中使用基于文本相似度的方法進行迭代計算,批量完成分類預(yù)處理;然后對分類的日志數(shù)據(jù)使用基于標(biāo)簽識別樹的日志模板提取方法進行模板提取;最后自主研究并實現(xiàn)了基于上述成果的模板表達式生成工作,完善日志模板提取算法,精準(zhǔn)的生成模板表達式.該方法不依賴于源程序相關(guān)知識,具有很好的普適性,且實驗證明該方法同時具有很高的準(zhǔn)確性.本次研究對于基于日志的分析計算具有很重要的意義.