基于正则表达式的日志解析系统构建研究
2020-04-09张军王芬芬
张军 王芬芬
摘 要:针对日志格式异构造成的日志解析局限性问题,文章介绍了一种基于正则表达式日志数据分组提取的方法,采用日志格式描述与日志内容解析相分离的策略,使用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.