閆 力, 夏 偉
(江南計(jì)算技術(shù)研究所, 無錫 214084)
日志是各類軟硬件記錄系統(tǒng)運(yùn)行狀態(tài)的一類重要數(shù)據(jù), 它描述了系統(tǒng)的歷史運(yùn)行狀態(tài)和詳情. 運(yùn)維工程師在進(jìn)行故障排除、安全性檢查等工作場景下, 經(jīng)常需要對日志數(shù)據(jù)進(jìn)行檢查和分析. 而大數(shù)據(jù)技術(shù)的迅猛發(fā)展使得現(xiàn)代數(shù)據(jù)中心規(guī)模日益擴(kuò)大, 復(fù)雜的系統(tǒng)每天都會(huì)產(chǎn)生數(shù)以千萬計(jì)的日志記錄, 一個(gè)運(yùn)行在中等規(guī)模網(wǎng)絡(luò)中的系統(tǒng)每天的日志量也能輕松超過TB級(jí)[1]. 體量巨大且種類繁多的日志數(shù)據(jù)使得運(yùn)維工程師難以再依賴簡單的關(guān)鍵詞搜索或者正則匹配等方式來進(jìn)行手工分析. 這不僅會(huì)帶來繁重而枯燥工作量,同時(shí)也是對運(yùn)維人員領(lǐng)域?qū)I(yè)知識(shí)的極大考驗(yàn)——只有對某類日志特征具有豐富的處理經(jīng)驗(yàn)才能設(shè)定出合理的過濾規(guī)則. 因此, 應(yīng)用機(jī)器學(xué)習(xí)技術(shù)為機(jī)器自身賦能, 實(shí)時(shí)或準(zhǔn)實(shí)時(shí)捕獲系統(tǒng)運(yùn)行狀態(tài)異常以實(shí)現(xiàn)日志分析自動(dòng)化, 是未來數(shù)據(jù)中心實(shí)現(xiàn)智能自主運(yùn)維的重要途徑之一.
日志、指標(biāo)、鏈路追蹤數(shù)據(jù)是運(yùn)維工作中最為核心的監(jiān)控和分析對象[2], 相較于指標(biāo)和鏈路追蹤數(shù)據(jù),日志是內(nèi)容最為豐富且來源充足的一類數(shù)據(jù), 系統(tǒng)的異常或者性能下降一般會(huì)在日志中優(yōu)先體現(xiàn)出來. 文章闡述了實(shí)現(xiàn)在線自動(dòng)日志異常檢測的主要步驟、關(guān)鍵技術(shù)、方法分類等內(nèi)容, 分析了日志分析的技術(shù)難點(diǎn), 并介紹了近期領(lǐng)域內(nèi)的最新研究成果. 最后, 提出今后的一些研究重點(diǎn)和思路.
日志異常檢測任務(wù)一般分為日志采集、日志解析、特征表示、異常判別4個(gè)步驟.
日志采集: 日志作為一種信息系統(tǒng)中廣泛存在的數(shù)據(jù), 往往散落于系統(tǒng)各處, 特別是對于分布式軟件、大型軟件等, 不同節(jié)點(diǎn)、不同組件都在持續(xù)生成和積累日志, 所以日志采集是日志異常檢測任務(wù)的第一步.較為常見的日志采集工具包括Logstash、Flume、Fluentd、Kafka等, 通過持續(xù)、實(shí)時(shí)的數(shù)據(jù)采集, 可以將數(shù)據(jù)集中入庫或者通過“發(fā)布-訂閱”的模式推送給消費(fèi)端進(jìn)行后續(xù)處理.
日志解析: 日志屬于半結(jié)構(gòu)化數(shù)據(jù), 需要分析其一般構(gòu)成, 并利用解析技術(shù)將其中的常量和變量分離出來, 為后續(xù)特征表示提供良好基礎(chǔ). 一條日志數(shù)據(jù)可以分解為正則消息部分和特征消息部分[3]. 正則消息包括時(shí)間戳、日志等級(jí)、產(chǎn)生日志的類名稱等日志基本組成, 這部分是可以用正則表達(dá)式進(jìn)行提取和分解的, 屬于日志數(shù)據(jù)的基礎(chǔ)信息. 特征消息部分則是描述了日志內(nèi)容的核心部分, 由文本、數(shù)字及特殊符號(hào)等組成.一條日志數(shù)據(jù)是由程序開發(fā)者在代碼中預(yù)先埋點(diǎn)編寫的各種輸出語句在滿足特定條件下產(chǎn)生的, 例如printf、log.info、log.warn等. 它包括了字符串常量和參數(shù)變量, 其中字符串常量被稱為日志模板(或事件、鍵值),表明了該條日志數(shù)據(jù)的類屬, 是日志消息的語義描述;參數(shù)變量則表明了系統(tǒng)狀態(tài)關(guān)鍵變量的取值, 例如對象ID、內(nèi)存消耗、執(zhí)行時(shí)間等. 其中日志模板由于是開發(fā)者對系統(tǒng)狀態(tài)的語義描述, 蘊(yùn)含豐富的信息, 往往作為重要的分析對象輸入后續(xù)檢測模型進(jìn)行異常判別.表1展示了截取自多個(gè)系統(tǒng)的日志片段, 并標(biāo)識(shí)了各個(gè)組成部分, 需要注意的是由于應(yīng)用軟件開發(fā)規(guī)范和開發(fā)者的編程習(xí)慣各異, 日志格式上也存在千差萬別.
表1 典型日志樣例解析
數(shù)據(jù)解析的精度將顯著影響檢測模型的性能表現(xiàn),有研究試驗(yàn)表明數(shù)據(jù)解析階段4%的錯(cuò)誤可能會(huì)在異常檢測階段導(dǎo)致性能下降擴(kuò)大一個(gè)數(shù)量級(jí)[4]. 日志解析從分析對象來源上區(qū)分, 可分為基于源代碼的模板抽取和基于日志文本的模板抽取. 有研究工作使用了基于源代碼中類似printf等語句來抽取模板[5,6], 但這種方式在多數(shù)情況下并不可行——因?yàn)樵创a分析難度大且難以獲得. 目前, 就基于日志文本來抽取模板的方式, 領(lǐng)域內(nèi)已經(jīng)提出了大量算法, 典型的有SLCT[7]、IPLoM[8]、LKE[9]、Spell[10]、Drain[11]、LPV[12]等.SLCT是最早提出的日志解析算法, 通過2次遍歷日志消息分別構(gòu)造日志詞匯表和候選簇, 再從簇中進(jìn)行模板抽取; IPLoM在模板生成前采用3步式分層劃分方法對日志消息進(jìn)行處理; LKE是由微軟提出的一種離線日志解析算法, 主要利用了分層聚類和啟發(fā)式規(guī)則;Spell基于最長公共序列來以在線方式解析日志模板;Drain使用一棵固定深度解析樹, 通過持續(xù)更新解析樹來在線獲得日志模板; LPV是最近提出的一種日志解析算法, 它使用Word2Vec詞嵌入技術(shù)[13]對日志消息向量化, 基于向量相似度來聚類, 日志模板從所聚類的簇中提取出來.
特征表示: 這部分工作的主要目的在于構(gòu)造機(jī)器學(xué)習(xí)模型可以處理的特征數(shù)據(jù), 借此來學(xué)習(xí)日志的正?;蛘弋惓DJ? 所提取特征的質(zhì)量決定了后續(xù)模型檢測效果所能達(dá)到的精度. 日志分析領(lǐng)域, 前一階段提取的日志模板一般被稱為事件或者鍵值. 在進(jìn)行特征提取前, 需要對連續(xù)的日志進(jìn)行切分, 通常有時(shí)間窗口、會(huì)話ID等方式: (1) 日志是一種具有時(shí)間屬性的連續(xù)文本, 一條日志數(shù)據(jù)是否提示異常不僅取決于自身所蘊(yùn)含的信息, 還受到其上下文的影響, 因此可采用固定或者滑動(dòng)時(shí)間窗口將日志切分成數(shù)據(jù)片段, 便于輸入模型進(jìn)行處理. 最優(yōu)時(shí)間窗口的大小可根據(jù)數(shù)據(jù)的特點(diǎn)進(jìn)行多次嘗試得到, 過小或過大的窗口都會(huì)對檢測精度帶來不利影響——過小的窗口會(huì)使得上下文信息不足, 而過大的窗口又會(huì)帶來冗余信息; (2) 某些日志的變量參數(shù)標(biāo)記了某一特定會(huì)話的執(zhí)行路徑, 例如HDFS日志中的block_id, OpenStack日志中的instance_id等, 可以根據(jù)會(huì)話ID將并行進(jìn)程產(chǎn)生的日志進(jìn)行剝離, 但這種方法僅限于具有此類變量參數(shù)的日志.
日志異常檢測通過采用的主要特征包括: 事件計(jì)數(shù)、事件序列、文本語義、時(shí)間間隔、變量取值、變量分布等[14], 這些特征的變化往往反映出系統(tǒng)狀態(tài)的異常. 事件計(jì)數(shù)表示日志中某一類別的事件數(shù)量大幅增加或者減少, 如Web應(yīng)用日志中某一時(shí)間段內(nèi)突然出現(xiàn)大量“Login failed”事件, 可能是系統(tǒng)出現(xiàn)安全事件的標(biāo)志; 由于具有時(shí)序?qū)傩? 正常日志事件出現(xiàn)的順序也會(huì)遵循一定的規(guī)律, 如OpenStack管理日志中, 一臺(tái)虛擬機(jī)的生命周期是從“VM Created”開始, 中間可能經(jīng)過若干次“Pause/Unpause”和“Suspend/Resume”的事件組合, 最終以“VM deleted”結(jié)束; 文本語義是通過自然語言處理技術(shù)解析日志文本自身攜帶的語義來判別日志是否出現(xiàn)異常; 時(shí)間間隔則是兩條日志消息相繼出現(xiàn)所經(jīng)過的時(shí)長, 由于絕大多數(shù)日志都帶有時(shí)間戳,時(shí)間間隔很容易計(jì)算, 如果特定兩條日志消息的時(shí)間間隔過大, 可能預(yù)示著服務(wù)性能的下降; 變量取值指的是模板抽取后分離出的參數(shù)變量如果取值超過正常閾值范圍, 則提示了系統(tǒng)的狀態(tài)異常, 例如某進(jìn)程消耗的內(nèi)存過大, 可能是出現(xiàn)了內(nèi)存泄漏. 變量分布則是對于某些參數(shù)變量的取值進(jìn)行分布統(tǒng)計(jì), 典型的如Web服務(wù)器日志中某一時(shí)間段同一源IP地址分布密度遠(yuǎn)大于其他地址, 則提示潛在威脅的出現(xiàn). 現(xiàn)有的研究成果提出的算法往往用到其中一種或者多種的組合, 這些特征表示從不同維度反映出系統(tǒng)的當(dāng)前狀態(tài).
異常判別: 經(jīng)過特征提取, 原始日志數(shù)據(jù)已經(jīng)轉(zhuǎn)換為模型可以處理的特征數(shù)據(jù), 可以輸入判別模型進(jìn)行異常檢測. 在檢測模型的設(shè)計(jì)上, 包括傳統(tǒng)機(jī)器學(xué)習(xí)方法和深度學(xué)習(xí)方法. 傳統(tǒng)機(jī)器學(xué)習(xí)方法具有硬件依賴性低、可解釋性好等特點(diǎn), 典型的有基于主成分分析的算法[5]、基于支持向量機(jī)的算法[15]、基于隱馬爾科夫模型的算法[16]、基于K最近鄰算法[17,18]、各種聚類算法[3,19]等. 傳統(tǒng)機(jī)器學(xué)習(xí)算法提取高級(jí)特征或者全局特征的能力相對有限, 特別是日志文本的語義識(shí)別、長距離依賴等問題上表現(xiàn)不如深度學(xué)習(xí), 所以有大量研究將深度學(xué)習(xí)引入日志異常檢測任務(wù). 基于深度模型的日志分析算法中包括基于長短期記憶網(wǎng)絡(luò)的算法[20-24]、基于雙向長短期記憶網(wǎng)絡(luò)的算法[25]、基于變分自編碼器的算法[6,26]、基于生成對抗網(wǎng)絡(luò)的算法[27]、基于Transformer網(wǎng)絡(luò)的算法[28,29]等. 但深度學(xué)習(xí)方法也并非“完美”: 首先, 深度學(xué)習(xí)作為一種端到端的解決方案, 屬于黑盒模型, 可解釋性較差; 其次, 為了獲得滿意的模型容量, 深度模型包含數(shù)層神經(jīng)網(wǎng)絡(luò), 參數(shù)量往往十分龐大, 訓(xùn)練時(shí)間長且消耗資源多. 本質(zhì)上, 異常判別模型是一個(gè)二分類器, 通過對新到達(dá)的日志消息進(jìn)行分析, 來推斷其屬于正?;虍惓?
關(guān)于日志異常檢測的研究普遍采用分類任務(wù)中的常用評(píng)價(jià)準(zhǔn)則, 即精確率(precision)、召回率(recall)和F1-score. 精確率表示在所有判別為異常的結(jié)果中正確判別結(jié)果所占比例, 精確率過低表示算法的誤檢率較高, 會(huì)帶來大量的系統(tǒng)誤警; 召回率表示在所有實(shí)際為異常的結(jié)果中正確判別結(jié)果所占比例, 召回率過低表示算法的漏檢率較高, 系統(tǒng)將不能識(shí)別大部分的日志異常; F1-score為精確率和召回率的調(diào)和平均數(shù), 兼顧了精確率和召回率對算法整體檢測效果的影響, 過低的精確率或召回率都會(huì)導(dǎo)致F1-score性能下降. 準(zhǔn)確率(Accuracy)表示所有判別正確的結(jié)果占總結(jié)果數(shù)的比例, 少部分文獻(xiàn)采用了準(zhǔn)確率作為評(píng)價(jià)指標(biāo), 但在正常和異常樣本數(shù)據(jù)比例嚴(yán)重失衡的日志異常檢測任務(wù)中, 占比大的樣本(正常日志)對準(zhǔn)確率的影響更大,一般不能很好反映算法的性能. 正式地, 有:
其中, TP (true positive)代表實(shí)際為真(異常日志)且判別也為正的結(jié)果數(shù); FP (false positive)代表實(shí)際為假(正常日志)但判別為正的結(jié)果數(shù); TN (true negative)代表實(shí)際為假且判別也為負(fù)的結(jié)果數(shù); FN (false negative)代表實(shí)際為真但判別為負(fù)的結(jié)果數(shù).
根據(jù)是否需要對特征數(shù)據(jù)打標(biāo)簽來進(jìn)行模型訓(xùn)練,可分為有監(jiān)督方法、半監(jiān)督方法和無監(jiān)督方法. 有監(jiān)督方法利用預(yù)先打過標(biāo)簽的特征數(shù)據(jù)對模型進(jìn)行訓(xùn)練,同時(shí)學(xué)習(xí)正常數(shù)據(jù)與異常數(shù)據(jù)的特征, 訓(xùn)練完成的模型即可對測試數(shù)據(jù)進(jìn)行判別(分類). 然而, 有監(jiān)督方法在日志分析中的熱度不如半監(jiān)督方法和無監(jiān)督方法,原因有以下幾點(diǎn): (1) 日志中的異常數(shù)據(jù)是相較稀少的,導(dǎo)致訓(xùn)練數(shù)據(jù)集失衡現(xiàn)象嚴(yán)重, 影響模型訓(xùn)練效果;(2) 為每條日志打上標(biāo)簽是非常耗時(shí)耗力的, 且需要對該類日志有較深的領(lǐng)域認(rèn)知, 才能做出正確判斷;(3) 有監(jiān)督方法得到的模型只能識(shí)別已知的異常日志,對于未見過的異常無法判斷. 相比于有監(jiān)督方法, 無監(jiān)督方法避免了上述問題, 主要通過聚類、降維等方法尋找具有相同或相近特征的數(shù)據(jù), 進(jìn)而識(shí)別出數(shù)據(jù)異常點(diǎn), 但也面臨著準(zhǔn)確率較低、容易受噪聲影響等問題. 半監(jiān)督方法介于二者之間, 通常只需要系統(tǒng)正常樣本即可完成訓(xùn)練過程, 實(shí)現(xiàn)前兩者的優(yōu)勢互補(bǔ).
指標(biāo)類數(shù)據(jù)屬于單變量或者多變量的時(shí)序數(shù)據(jù),鏈路追蹤數(shù)據(jù)屬于結(jié)構(gòu)化數(shù)據(jù), 輸出格式也相對固定且有限, 依據(jù)采用的收集工具(如谷歌的Dapper、推特的Zipkin等)即可確定. 但是, 因日志具有非結(jié)構(gòu)化特點(diǎn), 且沒有統(tǒng)一標(biāo)準(zhǔn), 使得日志輸出格式上自由度非常大, 這就使日志分析難度更大.
3.2.1 日志的不穩(wěn)定性
由于系統(tǒng)升級(jí)、應(yīng)用更新等原因, 源代碼的日志輸出語句會(huì)持續(xù)變化, 包括添加、刪除和修改等操作,致使前期模型訓(xùn)練數(shù)據(jù)當(dāng)中未發(fā)生變化的內(nèi)容越來越少, 進(jìn)而使異常檢測模型性能急劇下降甚至失效. 舉例來說, 一款來自微軟的軟件經(jīng)過數(shù)次版本迭代, 生成的日志中未發(fā)生變化的日志事件只占總數(shù)的30%左右[25].
3.2.2 易受噪聲干擾
噪聲并非日志消息自身攜帶, 而是在輸入模型處理前的各個(gè)環(huán)節(jié)引入的. 例如, 采集日志消息時(shí)由傳輸網(wǎng)絡(luò)不穩(wěn)定、系統(tǒng)斷電、軟件bug等引起的日志消息整體缺失或部分缺失; 又如, 解析過程中出現(xiàn)的日志模板抽取不準(zhǔn)確, 導(dǎo)致特征數(shù)據(jù)質(zhì)量降低. 日志解析錯(cuò)誤主要來自于兩種: (1) 語義理解偏差, 將參數(shù)變量解析為模板組成, 或反之. 如圖1所示, 在日志解析時(shí)將“hadoop”誤判為模板組成. (2) 詞表外詞匯(out of vocabulary)引入的解析錯(cuò)誤, 由于日志不穩(wěn)定性或者訓(xùn)練數(shù)據(jù)劃分等問題, 測試數(shù)據(jù)中出現(xiàn)訓(xùn)練過程中從未出現(xiàn)的詞匯, 致使日志解析出未知模板(事件), 影響模型性能. 文獻(xiàn)[28]就日志解析對模型性能的影響做了詳細(xì)的量化分析.
圖1 日志模板解析錯(cuò)誤示例
3.2.3 計(jì)算和存儲(chǔ)要求高
如前文所述, 日志種類多樣且規(guī)模日益增大, 涵蓋了從底層硬件、服務(wù)中間件、數(shù)據(jù)庫和上層應(yīng)用等多種來源. 海量的日志需要足夠大的存儲(chǔ)資源來承載數(shù)據(jù), 和快速實(shí)時(shí)處理能力來滿足時(shí)效性要求, 并且基于深度學(xué)習(xí)的算法還需昂貴的GPU資源來訓(xùn)練模型. 因此, 在做相關(guān)研究設(shè)計(jì)時(shí), 應(yīng)當(dāng)考慮盡量降低算法的存儲(chǔ)要求, 同時(shí)可利用大數(shù)據(jù)分布式處理工具(如Spark Streaming, Storm等)來實(shí)現(xiàn)并行處理, 這樣有利于算法更好地應(yīng)用于實(shí)際生產(chǎn)中. 文獻(xiàn)[1]提出的ADA算法通過在線訓(xùn)練的方式解決了深度模型需要大量數(shù)據(jù)來訓(xùn)練的問題, 進(jìn)而極大減少了對于存儲(chǔ)空間的需求.文獻(xiàn)[3]提出分布式日志處理框架, 通過Spark Streaming完成日志解析、特征提取、數(shù)據(jù)歸一化等步驟, 增強(qiáng)了算法面對海量實(shí)時(shí)日志的分析能力. 文獻(xiàn)[30]針對經(jīng)典日志解析算法面對海量日志解析能力不足的問題,基于Spark分布式計(jì)算框架提出了POP算法. 文獻(xiàn)[31]則基于GPU的并行能力改進(jìn)了LKE算法.
3.2.4 算法和模型可移植性差
由于日志格式自由度大, 因此不同的系統(tǒng)日志呈現(xiàn)出的特征模式不同, 同時(shí)根據(jù)應(yīng)用目的的不同, 即使同一類型日志關(guān)注的特征也可能有所差異. 現(xiàn)有研究多數(shù)基于有限的公開日志數(shù)據(jù)集[32]來開展算法和模型設(shè)計(jì), 所以其可移植性差, 難以實(shí)現(xiàn)成果復(fù)用. 文獻(xiàn)[14]詳細(xì)分析了日志異常模式的復(fù)雜性, 并提出一種組合式算法LogAD來針對不同異常模式來選擇合適的算法來處理.
該領(lǐng)域已經(jīng)有大量研究工作就如何實(shí)現(xiàn)自動(dòng)化的日志異常檢測提出了諸多算法和框架模型. 根據(jù)前述分類, 將現(xiàn)有成果進(jìn)行簡要說明, 并在附錄中以表格形式(表A1)對比了各個(gè)算法特點(diǎn).
文獻(xiàn)[5]使用PCA的方法來實(shí)現(xiàn)對日志的離線異常檢測. 其主要步驟是在完成對整個(gè)日志文件的解析后, 構(gòu)建狀態(tài)變量比率向量和消息計(jì)數(shù)向量2種特征,再應(yīng)用PCA來識(shí)別出異常數(shù)據(jù). 文獻(xiàn)[15]同樣構(gòu)造了以會(huì)話ID為行、以日志模板為列的特征矩陣, 只是通過專家知識(shí)對語義相近的模板進(jìn)行了合并, 減少了噪聲干擾. 最后, 應(yīng)用SVM對日志數(shù)據(jù)是否異常進(jìn)行判別. 文獻(xiàn)[16]針對Web日志提出二級(jí)機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)異常檢測. 首先, 利用帶有標(biāo)簽的訓(xùn)練數(shù)據(jù)訓(xùn)練一顆決策樹, 用來對測試數(shù)據(jù)分類, 生成正常數(shù)據(jù)集和異常數(shù)據(jù)集, 最后將正常數(shù)據(jù)分解參數(shù)后用于隱馬爾科夫模型的訓(xùn)練, 提取出所有訓(xùn)練數(shù)據(jù)中的正常狀態(tài)用以識(shí)別異常. 文獻(xiàn)[17]利用TF-IDF技術(shù)對日志模板向量化, 并使用meanshift聚類等方法為樣本打上標(biāo)簽, 最后利用標(biāo)簽化后的數(shù)據(jù)訓(xùn)練KNN模型來進(jìn)行新樣本的異常判別. 文獻(xiàn)[18]提出由K-prototype聚類和KNN分類組合的日志異常檢測算法, 先利用K-prototype來篩選出疑似異常對象, 再基于KNN給出最終判別結(jié)果. 文獻(xiàn)[19]基于字符串度量和數(shù)值度量設(shè)計(jì)了一種對日志消息進(jìn)行實(shí)時(shí)在線聚類的算法, 用于檢測信息與通信網(wǎng)絡(luò)中的攻擊. 文獻(xiàn)[3]構(gòu)建并基于Spark Streaming持續(xù)更新日志消息計(jì)數(shù)向量(message count vector),利用K-means聚類算法將這些向量分為正常和異常兩類.
上述算法在相應(yīng)的各類數(shù)據(jù)集上取得了最高約0.99的F1-score性能表現(xiàn).
日志數(shù)據(jù)的內(nèi)在復(fù)雜模式和長距離依賴等特點(diǎn),使得不少研究工作將深度學(xué)習(xí)引入日志異常檢測領(lǐng)域.
長短期記憶網(wǎng)絡(luò) (long short-term memory, LSTM)[33]作為一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò), 最早應(yīng)用于機(jī)器翻譯領(lǐng)域, 由于LSTM擅于保存序列中的長距離依賴關(guān)系,使其也適合應(yīng)用于日志分析當(dāng)中——捕捉日志消息中的遠(yuǎn)距離依賴關(guān)系. DeepLog[20]作為最經(jīng)典的基于深度學(xué)習(xí)的日志分析算法之一, 利用2層疊加的LSTM網(wǎng)絡(luò)實(shí)現(xiàn)了日志模板序列和參數(shù)變量的異常檢測.nLSALOG[21]同樣使用2層LSTM網(wǎng)絡(luò), 并在其中引入自注意力機(jī)制, 使得模型能更好地捕獲序列內(nèi)部的依賴關(guān)系, 提高異常檢測性能. LogAnomaly[22]在日志模板語義表達(dá)上做了改進(jìn), 利用dLCE自然語言處理模型通過詞嵌入技術(shù)生成模板向量, 再輸入LSTM進(jìn)行模型訓(xùn)練, 最終用于預(yù)測推斷. 這種方法可通過計(jì)算模板向量間的近似度將系統(tǒng)新產(chǎn)生的陌生日志模板匹配到模型已經(jīng)學(xué)習(xí)到的模板向量. LogNL[23]借鑒了DeepLog和LogAnomaly的優(yōu)勢, 通過2層LSTM完成日志模板和參數(shù)變量的異常判斷, 改善了有模型性能. LogMerge[24]對提取的日志模板基于詞向量加權(quán)求和后得到模板向量, 通過對2種類型日志的模板向量進(jìn)行聚類操作獲取簇中心向量, 實(shí)現(xiàn)了跨日志類型的異常檢測. 模型方面采用了CNN+LSTM的組合. LogRobust[25]利用一個(gè)雙向LSTM捕獲來自日志模板序列前向和后向兩個(gè)方向的依賴關(guān)系, 并應(yīng)用注意力機(jī)制識(shí)別出那些對判別結(jié)果更重要的日志模板. 同時(shí), 由于也使用了日志模板的語義表達(dá), 對于噪聲干擾有一定的魯棒性. NoTIL[34]是一種用于檢測日志消息時(shí)間間隔異常的算法, 通過滑動(dòng)時(shí)間窗口對日志序列進(jìn)行切分,并計(jì)數(shù)時(shí)間窗口內(nèi)的每類事件生成該窗口的表示向量,輸入LSTM來預(yù)測未來的時(shí)間窗口, 并基于實(shí)際結(jié)果與預(yù)測值間的誤差判別異常. ADA[1]引入在線深度學(xué)習(xí)技術(shù)[35], 基于LSTM提出了一種自適應(yīng)式的異常檢測算法, 具備在線學(xué)習(xí)能力的同時(shí), 還能夠根據(jù)當(dāng)前異常檢測結(jié)果自動(dòng)調(diào)整模型層數(shù).
門控循環(huán)單元 (gated recurrent unit, GRU)[36]是另一種重要的循環(huán)神經(jīng)網(wǎng)絡(luò), 基本原理和LSTM十分相似. PLELog[37]結(jié)合了有監(jiān)督方法和無監(jiān)督方法的優(yōu)勢, 通過對日志模板向量化后進(jìn)行聚類, 然后基于概率標(biāo)簽估計(jì)的方法為訓(xùn)練集中沒有標(biāo)簽的數(shù)據(jù)打上概率化的標(biāo)簽. 再以此輸入帶有注意力機(jī)制的GRU網(wǎng)絡(luò)中訓(xùn)練.
采用LSTM或者GRU搭建日志異常檢測模型是一個(gè)較普遍的做法, 但RNN類的模型需要順序輸入數(shù)據(jù), 致使其無法實(shí)現(xiàn)數(shù)據(jù)的并行化處理, 也就限制了其在大流量日志數(shù)據(jù)條件下的性能表現(xiàn). 近年來, 谷歌的Transformer模型[38]因其強(qiáng)大的快速并行能力在自然語言處理領(lǐng)域獲得了廣泛應(yīng)用, Transformer在處理大流量輸入數(shù)據(jù)方面的優(yōu)勢使有些學(xué)者將其引入日志分析任務(wù)中. HitAnomaly 算法[29]基于分層式的Transformer結(jié)構(gòu)分別將日志序列中的模板(事件)序列和參數(shù)(變量)序列轉(zhuǎn)化為兩個(gè)向量表示, 再利用注意力機(jī)制對二者加權(quán)求和, 最后通過Softmax層得到異常概率分布. NeuralLog算法[28]采用了BERT模型[39]對日志消息所有單詞進(jìn)行詞嵌入, 并對日志消息中所有的詞向量求均值得到日志消息的特征向量, 最后輸入基于Transformer的模型進(jìn)行訓(xùn)練及預(yù)測. 值得注意的是,NeuralLog并未使用日志解析技術(shù), 避免了日志解析錯(cuò)誤給異常檢測模型結(jié)果帶來的影響.
變分自編碼器 (variational auto-encoder, VAE)[40]是深度學(xué)習(xí)領(lǐng)域重要的生成模型之一, 廣泛用于圖像生成任務(wù). VAE通過編碼器將訓(xùn)練數(shù)據(jù)映射為隱空間內(nèi)的低維變量, 再由解碼器從隱空間中隨機(jī)采樣來生成訓(xùn)練數(shù)據(jù)的重構(gòu). 基于VAE的日志異常檢測算法一般是以重構(gòu)誤差來判斷異?;蛘咧苯咏o出異常概率.VeLog[6]以會(huì)話ID切分日志數(shù)據(jù), 并構(gòu)造日志執(zhí)行計(jì)數(shù)矩陣和日志執(zhí)行順序矩陣, 輸入VAE進(jìn)行訓(xùn)練, 以此來識(shí)別日志模板在數(shù)量和執(zhí)行路徑上的異常. 該方法對于訓(xùn)練集中未出現(xiàn)的日志模板會(huì)判斷為異常, 需將新出現(xiàn)的模板加入訓(xùn)練集對模型重新訓(xùn)練. 文獻(xiàn)[26]提出的hybrid CAE and VAE framework將日志模板序列進(jìn)行獨(dú)熱編碼(one-hot encoding)后, 使用卷積自編碼器 (convolutional auto-encoder, CAE)將其壓縮以提取序列高層特征, 再輸入VAE進(jìn)行訓(xùn)練, 學(xué)習(xí)日志模板序列的正常模式.
生成對抗網(wǎng)絡(luò) (generative adversarial network,GAN)[41]作為另一種重要的深度生成模型, 也有研究人員將其用于日志分析任務(wù). 文獻(xiàn)[27]為解決日志數(shù)據(jù)不平衡的問題基于生成對抗機(jī)制設(shè)計(jì)了生成器和判別器, 通過二者博弈來相互提高性能, 直至收斂. 最后, 利用生成器可產(chǎn)生出逼近真實(shí)異常樣本的模擬數(shù)據(jù), 進(jìn)而在檢測時(shí)輸出當(dāng)前日志模板序列模式下后續(xù)可能事件正?;虍惓5母怕史植?
上述算法在相應(yīng)的各類數(shù)據(jù)集上取得了最高約0.99的F1-score性能表現(xiàn).
日志屬于軟件開發(fā)者對系統(tǒng)實(shí)時(shí)狀態(tài)的描述文本,這種特點(diǎn)令自然語言處理中的諸多詞嵌入技術(shù)可以應(yīng)用于日志分析當(dāng)中并變得越來越重要. 獨(dú)熱編碼屬于最簡單的編碼方式, DeepLog、ADA、hybrid CAE and VAE framework等都采用了這種方式, 但獨(dú)熱編碼存在維度災(zāi)難和語義鴻溝(即編碼向量由于詞匯表龐大而變得非常稀疏, 且所有向量均正交, 不能體現(xiàn)語義相似性), 使其應(yīng)用受限. 相比之下, Word2Vec、FastText[42]、Glove[43]等詞向量相關(guān)技術(shù)能更好地表現(xiàn)日志語義關(guān)系, 也被大量研究工作所采用, 如LogRobust、PLELog、LogMerge等, 但這幾種技術(shù)并不能很好地解決一詞多義的現(xiàn)象. 詞表外詞匯的出現(xiàn)在日志中十分普遍, 據(jù)文獻(xiàn)[28]研究, 某些數(shù)據(jù)集(如BGL)中即使訓(xùn)練集達(dá)到80%時(shí), 仍有超過80%的詞匯在訓(xùn)練集中從未出現(xiàn). 能否處理好詞表外詞匯是日志語義表征能力的重要體現(xiàn). 有研究專門為日志分析提出了一種語義表征框架Log2Vec[44], 通過MIMICK算法[45]解決詞表外詞匯的向量表示, 但其字符級(jí)推算的方式難以獲得有實(shí)際意義的詞向量. NeuralLog算法采用BERT模型來表征日志語義, 不僅能夠解決一詞多義問題, 也可以在子詞級(jí)別推算詞表外詞匯的含義, 獲得相對更有意義的詞向量. 總之, 語義表征是日志分析中的重要一環(huán), 能夠提高算法的魯棒性, 在一定程度上抵抗日志不穩(wěn)定性帶來的影響.
如前文所述, 現(xiàn)代軟件產(chǎn)品多采用Dev Ops敏捷開發(fā)模式, 產(chǎn)品的持續(xù)集成、持續(xù)部署加速了其迭代更新, 從而也使得日志模式持續(xù)演進(jìn), 產(chǎn)生不穩(wěn)定性. 而日志不穩(wěn)定性會(huì)導(dǎo)致持續(xù)出現(xiàn)新的日志模板和更多的詞表外詞匯. 所以在設(shè)計(jì)有關(guān)算法時(shí), 不得不考慮模型的持續(xù)更新能力, 以適應(yīng)新出現(xiàn)的日志模式. 過往研究中, 主要有3種方法來進(jìn)行模型更新: 一是定期對模型重新訓(xùn)練以適應(yīng)新的日志模式; 二是基于運(yùn)維人員對檢測結(jié)果的反饋, 對模型就行及時(shí)修正, 如DeepLog、VeLog等; 三是引入在線學(xué)習(xí)機(jī)制, 如ADA等. 模型定期重新訓(xùn)練的方式不僅在實(shí)時(shí)性上滿足不了生產(chǎn)要求,也會(huì)帶來較大的計(jì)算和時(shí)間開銷(特別是深度學(xué)習(xí)模型). 應(yīng)該說運(yùn)維人員參與到日志異常檢測任務(wù)當(dāng)中來是必要的, 特別是通過人工反饋的方式可以引入領(lǐng)域?qū)<抑R(shí), 而這些是無法單純憑借算法獲得的. 但應(yīng)考慮模型的在線更新機(jī)制的設(shè)計(jì), 盡量減少重復(fù)訓(xùn)練帶來的開銷. 文獻(xiàn)[46]提出了終身學(xué)習(xí)的日志異常檢測方法, 通過反饋結(jié)果來對模型進(jìn)行更新(而不是重新訓(xùn)練). 在線學(xué)習(xí)是一種重要的研究思路, 可以將數(shù)據(jù)以流的方式輸入模型進(jìn)行逐步優(yōu)化的動(dòng)態(tài)訓(xùn)練和預(yù)測,令模型更具擴(kuò)展性.
日志大體量和多類型的特點(diǎn)對檢測算法提出了并行度和通用性要求. 首先, 不論是基于傳統(tǒng)機(jī)器學(xué)習(xí)算法還是深度學(xué)習(xí)算法, 均需考慮算法部署于生產(chǎn)環(huán)境下的并行化能力, 以滿足海量日志處理的需求, 例如文獻(xiàn)[3]利用大數(shù)據(jù)相關(guān)技術(shù)實(shí)現(xiàn)日志的全流程并行處理, 使其具有實(shí)際應(yīng)用能力. 同時(shí), 在某些計(jì)算、存儲(chǔ)資源不充沛的條件下, 還應(yīng)當(dāng)盡量減少日志分析處理過程中的計(jì)算和存儲(chǔ)開銷, 如ADA算法通過在線深度學(xué)習(xí)減少了在空間存儲(chǔ)上的需求. 其次, 結(jié)合日志數(shù)據(jù)的異常模式和應(yīng)用場景的多樣化, 算法設(shè)計(jì)應(yīng)盡可能具有一定的通用性, 或者只需要根據(jù)數(shù)據(jù)特征或場景需求進(jìn)行微調(diào)即可快速應(yīng)用, 如LogAD即是一種典型的組合式方法, 其應(yīng)對復(fù)雜場景下多種日志模式的異常檢測綜合能力明顯提高.
為了在智能運(yùn)維場景下更好地進(jìn)行故障預(yù)警和輔助運(yùn)維人員進(jìn)行事件處理, 日志異常檢測任務(wù)不應(yīng)停留在只檢測當(dāng)前日志是否出現(xiàn)異常, 也應(yīng)注重檢測結(jié)果的可解釋性. 例如, 當(dāng)前異常由何種特征提示、如何以運(yùn)維人員能夠看得懂的方式呈現(xiàn)、異常的相互關(guān)聯(lián)問題、異??赡艿挠绊懛秶绾蔚葐栴}. 即在更高層次賦予檢測結(jié)果良好的可解釋性和輔助決策能力, 是該項(xiàng)技術(shù)的深化和延展. DeepLog、LogAD中都試圖構(gòu)建任務(wù)執(zhí)行的工作流, 很好地印證了填補(bǔ)機(jī)器算法輸出與人之間理解鴻溝的重要性. 特別地, 由于深度學(xué)習(xí)一般被認(rèn)為是端到端的黑盒模型, 基于深度模型的算法可解釋性較差, 目前已經(jīng)有相關(guān)研究致力于獲得檢測結(jié)果的可解釋性[47].
日志異常檢測任務(wù)是智能運(yùn)維發(fā)展的重要落地場景, 是機(jī)器學(xué)習(xí)和運(yùn)維管理結(jié)合的重要一環(huán). 大量研究已經(jīng)表明, 將機(jī)器學(xué)習(xí)應(yīng)用于日志分析當(dāng)中, 可以有效應(yīng)對當(dāng)下數(shù)據(jù)中心日志體量急速膨脹導(dǎo)致分析難、管理難的問題. 文章對日志異常檢測任務(wù)的典型流程、技術(shù)難點(diǎn)、相關(guān)研究工作和后續(xù)研究重點(diǎn)都做了詳細(xì)闡述和分析, 對于該領(lǐng)域研究具有一定的參考價(jià)值.
附錄
為了更清晰直觀地比較各個(gè)算法的技術(shù)路徑和優(yōu)劣勢, 文章給出了算法對比表, 如表A1所示.
表A1 各算法對比詳情表
表 A1 (續(xù)) 各算法對比詳情表
表 A1 (續(xù)) 各算法對比詳情表
表 A1 (續(xù)) 各算法對比詳情表