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