張軍 王芬芬
摘? ?要:針對日志格式異構(gòu)造成的日志解析局限性問題,文章介紹了一種基于正則表達(dá)式日志數(shù)據(jù)分組提取的方法,采用日志格式描述與日志內(nèi)容解析相分離的策略,使用XML語言編寫日志格式描述和日志數(shù)據(jù)項(xiàng)說明的腳本文檔,該腳本文檔與日志類別相對應(yīng),與具體的解析程序分離,提高了日志解析系統(tǒng)的靈活性和擴(kuò)展性。
關(guān)鍵詞:日志解析;正則表達(dá)式;可擴(kuò)展標(biāo)記語言
互聯(lián)網(wǎng)技術(shù)高速發(fā)展,大多企事業(yè)單位都已經(jīng)構(gòu)建自己的網(wǎng)絡(luò)平臺和信息系統(tǒng),各種網(wǎng)絡(luò)設(shè)備和信息系統(tǒng)的數(shù)量及規(guī)模都在擴(kuò)大,也愈來愈復(fù)雜[1]。運(yùn)維人員為及時(shí)了解各類設(shè)備和系統(tǒng)的運(yùn)行狀況,大多會(huì)去查閱設(shè)備或系統(tǒng)產(chǎn)生的日志數(shù)據(jù),其大多以文本方式保存在相關(guān)的系統(tǒng)內(nèi)部,記錄了設(shè)備或系統(tǒng)在運(yùn)行時(shí)所產(chǎn)生的各種數(shù)據(jù),對運(yùn)維人員了解系統(tǒng)運(yùn)行狀況和排查問題起到至關(guān)重要的作用[2]。但一般都是數(shù)據(jù)量龐大且以非結(jié)構(gòu)化的方式存儲(chǔ),非常不利于查看和分析,如何有效地解析日志數(shù)據(jù)并能將其以結(jié)構(gòu)化的方式存儲(chǔ),成為一個(gè)亟需解決的問題。
近年來,關(guān)于日志分析與處理的關(guān)注與研究越來越多。傳統(tǒng)的通過開發(fā)人員經(jīng)驗(yàn)和認(rèn)知來分析日志關(guān)鍵字的方式不僅效率低下且針對性強(qiáng)[3];通過自定義規(guī)則來解析日志,對開發(fā)人員的經(jīng)驗(yàn)和知識具有很強(qiáng)的依賴性。當(dāng)系統(tǒng)更新或更換,新的日志內(nèi)容就不再適用既有的規(guī)則,需重新編碼定義規(guī)則,該方式靈活性差,不具擴(kuò)展性。因此,本文考慮采用日志文件內(nèi)容格式的描述與日志內(nèi)容識別解析相分離的思想,實(shí)現(xiàn)日志解析過程與日志格式描述無關(guān)。具體策略如下:首先,將待解析的日志內(nèi)容進(jìn)行預(yù)處理,以提升解析效率。其次,提取描述日志格式的正則表達(dá)式和關(guān)鍵字含義,將其作為可變參數(shù)寫入配置文件中,不同的日志匹配不同的配置文件[4],日志解析系統(tǒng)根據(jù)配置文件完成不同日志的數(shù)據(jù)匹配與解析,最后將解析結(jié)果進(jìn)行持久化處理,形成關(guān)系型結(jié)構(gòu)化數(shù)據(jù)。
1? ? 系統(tǒng)設(shè)計(jì)
基于上述分析,本文旨在構(gòu)建一種具有良好擴(kuò)展性和較高解析效率的日志解析系統(tǒng)。相比傳統(tǒng)解析方式,采用日志格式描述與內(nèi)容解析相分離的策略能有效提高解析系統(tǒng)的擴(kuò)展性和靈活性。首先,日志解析系統(tǒng)需要為待解析的每一種日志編寫一個(gè)匹配模式,用正則表達(dá)式描述。其次,將用于解釋日志各個(gè)數(shù)據(jù)項(xiàng)的屬性說明和該日志的解析正則表達(dá)式相結(jié)合,形成日志的解析配置文件,實(shí)現(xiàn)模式描述與內(nèi)容解析相分離。同時(shí),日志內(nèi)容數(shù)量龐大的一個(gè)主要原因是日志里包含了大量相同或無分析價(jià)值的信息,本日志解析系統(tǒng)將增加日志預(yù)處理與日志過濾模塊,以增加日志內(nèi)容的價(jià)值密度,提高解析效率和分析價(jià)值。本文所構(gòu)建的日志解析系統(tǒng)主要包含日志收集、數(shù)據(jù)預(yù)處理、日志解析、日志分類存儲(chǔ)、日志分析。
日志收集主要任務(wù)是將分散在不同服務(wù)器或設(shè)備上的待處理原始日志文件采集至日志解析系統(tǒng)指定位置,不同系統(tǒng)或設(shè)備所產(chǎn)生的日志默認(rèn)存儲(chǔ)在系統(tǒng)所在服務(wù)器的本地文件系統(tǒng)中,需要操作人員手動(dòng)收集,也可使用日志收集工具進(jìn)行自動(dòng)收集,部分過于龐大的日志還需要進(jìn)行初步的過濾以提升效率。
數(shù)據(jù)預(yù)處理是日志解析前的準(zhǔn)備工作,在保證解析數(shù)據(jù)的價(jià)值和正確的同時(shí),通過對原始日志數(shù)據(jù)中相同或相似的數(shù)據(jù)進(jìn)行清理和合并,減少日志的數(shù)據(jù)量,降低日志解析模塊的處理負(fù)擔(dān),提高解析效率。
日志解析是系統(tǒng)的核心功能,根據(jù)預(yù)先設(shè)定的日志格式化配置文件(包含正則表達(dá)式和日志數(shù)據(jù)項(xiàng)屬性描述),匹配日志內(nèi)容中有效字段數(shù)據(jù),對匹配數(shù)據(jù)進(jìn)行規(guī)范化處理。
日志分類存儲(chǔ)主要將解析得到的規(guī)范化數(shù)據(jù)依據(jù)相關(guān)規(guī)則進(jìn)行聚集處理,形成某一事件類別相關(guān)的日志集合,通過分類聚合可以將與特定事件相關(guān)的數(shù)據(jù)聚集在一起,能夠過濾掉與用戶分析需求關(guān)聯(lián)性不高的數(shù)據(jù),進(jìn)一步增加數(shù)據(jù)的價(jià)值密度,降低后續(xù)日志分析的數(shù)據(jù)規(guī)模,提高分析效率與分析精度。
日志分析是日志解析系統(tǒng)的最終目的,將已經(jīng)解析、處理的日志數(shù)據(jù)按照用戶具體的分析需求,引入相關(guān)的分析算法,分析結(jié)果幫助操作者理解系統(tǒng)行為、解決系統(tǒng)問題。
2? ? 系統(tǒng)實(shí)現(xiàn)
系統(tǒng)采用的是日志數(shù)據(jù)描述與數(shù)據(jù)解析相分離的思想,日志格式采用正則表達(dá)式描述。首先,將一條典型的日志數(shù)據(jù)進(jìn)行分組正則化處理,形成該類日志的正則表達(dá)式模式字符串。其次,讀取日志文件,將每一條日志數(shù)據(jù)與模式字符串進(jìn)行匹配操作,可以將日志文件中的每一條日志里包含的數(shù)據(jù)項(xiàng)都分離抽取出來。同時(shí),在日志描述配置文件中,除了用于模式匹配的正則表達(dá)式,還包含日志各個(gè)數(shù)據(jù)項(xiàng)的現(xiàn)實(shí)意義。最后,將匹配分離出的各個(gè)數(shù)據(jù)項(xiàng)同其屬性意義對應(yīng)組合,即可形成格式化的日志記錄。結(jié)合上述具體需求,本文采用可擴(kuò)展標(biāo)記語言(Extensible Markup Language,XML)來構(gòu)建日志解析配置文件,XML語言結(jié)構(gòu)簡單、清晰,使用便捷,大多編程語言對其都提供了良好的支持。
系統(tǒng)提供了簡單解析模式和完整解析模式,簡單解析模式可用于單條日志數(shù)據(jù)的實(shí)時(shí)解析,主要思想是將無結(jié)構(gòu)的日志數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化的過程。
依據(jù)上述所描述的日志解析流程與解析策略,需為每一類日志構(gòu)造一個(gè)日志解析配置文件,文件包含日志的格式描述和屬性說明,日志配置文件使用XML語言構(gòu)建,XML采用樹形結(jié)構(gòu),具有較好的擴(kuò)展性和語義性,能夠便捷地通過自定義標(biāo)簽表示特定的語義信息,并且當(dāng)前主流的編程語言對其提供了良好的支持。
本文以Apache日志為例,簡要說明日志配置文件的構(gòu)建過程和方法。Apache日志主要有兩種:一是訪問日志access.log。二是錯(cuò)誤日志error.log。訪問日志又包括普通日志格式和復(fù)合日志格式,下面是一條隨機(jī)采集Apache復(fù)合訪問日志的內(nèi)容:
將上述分組處理的正則描述組合起來,加上行首和行尾的匹配符即可形成完整的日志格式描述正則表達(dá)式,再將日志內(nèi)容中各數(shù)據(jù)項(xiàng)的屬性說明和正則表達(dá)式共同組成該日志的解析配置文件,即可對Apache訪問日志進(jìn)行解析。本文構(gòu)建的日志解析系統(tǒng)采用C#語言開發(fā),首先,使用XmlDocument類對日志解析配置文件進(jìn)行讀寫操作,獲取日志格式描述的正則表達(dá)式和日志各數(shù)據(jù)項(xiàng)的屬性說明,完成匹配,獲取各個(gè)分組的數(shù)據(jù)。其次,將各分組的數(shù)據(jù)同XML配置文件中的屬性說明一一對應(yīng),形成格式化的日志解析數(shù)據(jù)。本文主要使用Regex類的Match方法完成數(shù)據(jù)的匹配和分組,最終形成格式化的日志數(shù)據(jù)記錄,該記錄可保存至關(guān)系型數(shù)據(jù)庫中,便于實(shí)現(xiàn)日志數(shù)據(jù)的統(tǒng)計(jì)分析,也可作為數(shù)據(jù)分析和數(shù)據(jù)挖掘的原始數(shù)據(jù)集。
3? ? 結(jié)語
本文重點(diǎn)是提高日志解析的效率和靈活性,為不同種類的日志編寫日志解析配置腳本文件,腳本文件用XML語言描述,使得描述日志格式和數(shù)據(jù)項(xiàng)屬性的腳本文件與具體的解析程序相分離,當(dāng)產(chǎn)生日志的設(shè)備或系統(tǒng)出現(xiàn)新增、更新時(shí),新的日志類型出現(xiàn),只需根據(jù)新的日志類型為其編輯XML腳本文件即可,無需更新日志解析程序,大大提高了系統(tǒng)的擴(kuò)展性與靈活性。同時(shí)系統(tǒng)具有結(jié)構(gòu)簡單、邏輯清晰的特性,能滿足多種不同的解析需求,與當(dāng)前各類設(shè)備自帶或第三方的日志解析系統(tǒng)相比具有一定的優(yōu)勢,對類似日志解析系統(tǒng)的建設(shè)也具有一定的借鑒意義。
[參考文獻(xiàn)]
[1]許長福.日志數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2017.
[2]姚攀,馬玉鵬,徐春香.基于ELK的日志分析系統(tǒng)研究及應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2018(7):298-303.
[3]宋橋白.基于Hadoop大數(shù)據(jù)平臺的網(wǎng)站日志解析系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[D].廈門:廈門大學(xué),2018.
[4]高陽陽,徐烈偉,俞劍.一種新型動(dòng)態(tài)可重構(gòu)的正則表達(dá)式匹配引擎設(shè)計(jì)[J].復(fù)旦學(xué)報(bào)(自然科學(xué)版),2019(6):706-716.