一种基于目标模型的日志记录和错误分析工具的制作方法

专利2022-06-29  80


本发明涉及的是日志记录和日志分析领域,具体是一个基于目标模型的日志记录和错误分析工具(即jllap),是intellijidea的插件,在实时模式下工作,旨在指导开发人员正确记录日志和快速定位错误原因从而最终改进日志实践。



背景技术:

日志是软件系统或服务在运行时的足迹,可以帮助软件工程师理解他们运行时的行为。有各种各样具有不同目的的软件工程任务依赖于日志,例如调试、监视、缺陷预测、审计等。日志对于诊断测试环境和生产环境中所发生的问题具有重要意义。在某些极端情况下,日志是软件工程师处理生产问题时唯一可访问的资源和信息来源。

日志记录是一种软件工程实践,开发人员将日志语句插入到源代码中,系统或服务会运行这些语句从而产生日志,其重要性已在业界得到认可。尽管如此,但由于缺乏标准化的指南,产业界在日志实践中正面临着诸多挑战。当前,特定软件系统生成千兆字节的日志数据并不罕见,而这些日志数据充满了无用且冗余的记录。因此,日志记录的低效率导致日志分析的困难和低效率,最终导致分析结果不充分甚至不准确。利用具有庞大信息量的日志来准确描述软件系统的行为和状态已然成为一个亟待解决的痛点。



技术实现要素:

本发明是一个名为jllap(基于目标模型的日志记录和错误分析工具)的原型工具,旨在通过将日志记录和日志分析结合在一起来处理上述问题。jllap试图指导开发人员插入被认为是良好实践的日志记录语句,从而服务于日志分析过程。在日志被记录之后,jllap能够帮助开发人员在寻找错误时缩小可能发生错误的范围。至此,日志记录和日志分析实践将形成一个闭环,其中日志规范化记录提供高质量日志以改进日志分析,而日志分析结果反过来促进日志记录的规范化。

jllap由两部分组成,即loglint和loganalyzer。loglint是为开发人员插入日志语句设计的,基本上用于编码过程中。loganalyzer分析由loglint插入的日志语句生成的日志并以此来定位程序运行失败的原因。这两部分的实现都基于目标模型。

本发明的具体技术方案如下所述:

1.目标模型

目标模型是loglint和loganalyzer中都运用到的一个重要概念。目标模型是用来表示软件执行的抽象结构的,是一种树形结构。

目标和任务:目标模型包括目标和任务两种概念。目标表示开发人员打算从日志文件中获取的目标对象。任务是特定目标的组成部分。通常,一个目标可以被划分成多个任务,并且一些任务可以进一步被分为子任务。任务是整个执行过程的一部分。

模式:在树形结构的目标模型中,每个树节点都有自己的预置模式和后置模式。这两种模式分别表示一个特定任务或目标的开始条件和结束条件。我们的工具使用预置模式和后置模式来分割日志消息,最终将日志文件转换为目标树。

状态:目标和任务都有自己的状态,状态指示任务或目标是否完成执行,或者是否有任何类型的故障或异常。此工具定义了下面四种状态:

正常状态:目标或任务是完整无误的。

错误状态:目标或任务完成,但包含错误。

预置模式缺失状态:目标或任务缺失预置模式。

后置模式缺失状态:目标或任务缺失后置模式。

2.日志记录:loglint

loglint提供了几种动态功能以便开发人员可以在编码过程中使用。loglint的主要功能包括代码检查和自动插入两部分:

自动检查:jllap会在开发人员编写的同时自动扫描当前代码。在扫描期间,它根据树形结构目标模型和其他几个日志记录规则(不同的规则设计了对应的系统模块)检查特定位置中缺少的日志记录语句。也就是说,如果开发者忘记使用上述目标模型中预定义的模式插入日志记录语句,jllap将提示开发人员。通过这种方式,jllap可确保提供给loganalyzer的日志记录信息的完整性。此外,根据学术界的研究,几个被认为是良好日志记录的规则也被添加进去了。

自动插入:代码检查后,jllap提供了一个名为”快速修复”的功能,供开发人员根据代码上下文方便地插入日志语句。intellijidea支持此功能,这也是我们选择为ide开发插件的原因之一,jllap能够为开发人员提供了日志记录语句的推荐内容和级别。此外,它支持大多数基于java的日志库,例如log4j、slf4j、javautil日志记录等。

3.日志分析:loganalyzer

loganalyzer利用树形结构的目标模型将日志分为一组目标和任务,从而捕获软件系统的主要执行状态以帮助开发人员缩小故障位置。对于特定的软件系统,开发人员基本上可以找出程序的执行逻辑和路径。loganalyzer基于这个假设,具体实现可分为三个步骤:

1)以模版方式给定树形结构的目标模型,jllap识别并存储目标模型。开发人员使用模板来描述目标模型。

2)jllap将原始日志文件作为其输入,然后根据模板(即预定义的目标模型)划分日志文件。通常,jllap逐行扫描整个日志文件,并确定日志是否与模板匹配。根据目标模型模板,jllap扫描日志文件,最后将每条日志分组至目标或任务。

3)jllap确定每个目标或任务的状态。目标或任务是错误状态时,可能是因为它或它的子任务包含异常调用堆栈或error级别日志等;当是正常状态时,可能因为是它或它的子任务包含低于安全级别的日志且无异常;当是模式缺失状态时,可能是因为日志与模式不匹配时(任务缺失前置和后置模式)。

对于经验丰富的开发人员来说,这种树状结构的目标模型以及状态能够节省大量人力并找出软件运行失败的原因,并且还可有有效地根据日志分析结果丰富检查规则且标准化日志记录实践。

附图说明

1.图1为本发明架构图;

2.图2为目标模型说明图;

3.图3为检查规则启动和等级的配置界面;

4.图4为本发明中使用的检查规则的说明;

5.图5为关键类和方法检查规则的定制界面;

6.图6为代码缺失日志记录语句高亮提示及”快速修复”功能示例图;

7.图7为目标模型的模板配置图示;

8.图8为日志分割及状态显示示例图;

具体实施方式

本实施例包括以下步骤。

第一步:在intellijidea中安装jllap工具并启动。

第二步:开发人员需要以模版形式给定树形结构的目标模型,jllap将会识别并存储目标模型。

目标模型是用来表示软件执行的抽象结构的一种树形结构。依据此模型,开发人员需要将打算从日志文件中获取的内容描述为目标,它是树形结构的根节点。以运行sql语句出现故障的情况为例子,此时找出发生故障的根本原因便是目标模型的目标,这意味着目标模型将会捕获与sql运行情况相关的日志消息。

某个具体目标的组成部分描述为任务,同时是树形结构的子节点。一个目标可以被划分成多个任务,并且一些任务可以进一步被分为子任务。以上述运行sql语句找出根本故障原因的目标为例,目标“运行sql”可以分为三个任务:解析与逻辑计划,锁获取,物理计划。在这些任务中,任务“物理计划”有一个子任务:运行作业。

作为树的节点,目标和任务都有自己的预置模式和后置模式,分别表示自己的开始条件和结束条件,本发明将会使用预置模式和后置模式来分割日志消息,并最终将日志文件转换为目标树。

每一个任务和目标都可以用状态来描述,标示任务或目标是否完成执行,或者是否有任何类型的故障或异常。共有四种不同的状态:正常状态代表目标或任务是完整无误的;错误状态代表目标或任务完成,但包含错误;前置缺失状态代表目标或任务缺失预置模式;后置缺失状态代表目标或任务缺失后置模式。这些状态可以帮助开发人员捕获软件系统的主要执行状态。

第三步:开发人员可以在intellij检查配置中配置要启动的的检查规则和日志等级。

检查规则包括:断言检查、异常检查、关键分支检查、线程相关检查、服务器相关检查、数据库相关检查、关键类和方法检查。这几种检查规则都可以分别设定为启用或者关闭状态,并且在启动时为每个检查规则设定日志等级。插件安装之后,用于关键的类和方法检查的规则是默认启用的,日志等级默认为警告。

第四步:开发人员可以通过单击工具栏上的蓝色圆形按钮来定制关键类和方法检查规则的配置。

单击按钮之后,会弹出用于配置的对话框。开发人员在对话框中输入要检查的类和方法名称。比如想要配置检查所有testpkg包下test类中以func为开头方法的检查规则,可以在对话框中输入:testpkg.test.func.*。

第五步:开发人员按照目标模型以及检查规则开始编写代码。

在开发人员编写代码时,loglint会根据会根据树形结构的目标模型和其他几个日志记录规则自动扫描当前代码,此功能由根据代码规则检查项所设计的相应的系统模块负责实现。当loglint部分检查到特定位置中缺少日志记录语句时,intellij会高亮显示相应的代码段。具体实现上,loglint获取当前代码的ast(抽象语法树)然后利用正则表达式匹配来检查缺少的日志记录语句。比如说如果开发人员定制关键类和方法检查规则时如第四步在对话框中输入testpkg。test.func.*,那么当有testpkg包下test类中以func为开头的方法中没有符合规范的日志语句时,这些方法将会以高亮的形式显示出来,用来提醒开发人员此处缺少日志记录语句。

在intellijidea提供的支持下,jllap在发现缺少日志记录语句给予开发人员提示的同时,也会提供一个“快速修复”列表,开发人员可以选择“快速修复”列表的一条语句来补充缺失的日志记录语句,不仅可以让开发人员根据代码上下文方便地插入所缺失的日志语句,而且还能够为开发人员提供日志记录语句的推荐内容和级别。此外,它支持大多数基于java的日志库,例如log4j、slf4j、javautil日志记录等。

第六步:开发完项目后,如果在运行过程中出现故障情况,开发人员可以利用loganalyzer,捕获软件系统的主要执行状态从而帮助开发人员缩小故障位置。

首先,开发人员要将预先设定好的目标模型,表示为程序能够识别的模式,因此用模板来描述目标模型。模板将以结构化的伪代码形式详细描述每个目标的名称、前置条件和后置条件以及组成此目标的任务。而每个任务也需要详细记录它的名称、前置条件和后置条件,而当某个任务有子任务时,也需要详细记录下来。

接下来开发人员可以利用loganalyzer部分逐行扫描整个日志文件,并确定日志是否与模板(即预定义的目标模型)匹配,然后根据模板将每条日志分组至目标或任务,最终将日志文件转换为目标树。为了更清楚的表达,开发人员可以对日志文件的进行编号。比如一个实际运行中的日志从1行到第21行的日志消息被分类为目标“运行sql”;从第2行到第3行的日志消息是任务“解析和逻辑计划”;第4行的日志消息是任务“锁获取”;从第5行到第20行的日志消息是任务“物理计划”;从第6行到第19行的日志消息是子任务“运行作业”。

最后jllap确定每个目标或任务的状态,从而根据目标或者任务的状态来分析系统运行情况。上述实际运行中的日志经分割之后子任务“运行作业”包含异常调用堆栈和错误级别的日志消息,因此它是“错误状态”;而因为任务“物理计划”的子任务“运行作业”是“错误状态”,所以它也是“错误状态”;任务“锁获取”因为缺失“后置模式”而是“后置模式缺失状态”;任务“解析与逻辑计划”因为包含的日志消息都是信息级别且没有出现异常所以是“正常状态”;最终“运行sql”的目标是“错误状态”。由此开发人员成功地找到了出现故障的位置,从而可以解决故障。

综上,在loglint的帮助下,开发人员可以或多或少地标准化他们的日志记录实践,并为后续日志分析提供更有效的信息。loganalyzer还可以丰富loglint的检查规则,并最终形成良性的闭环。


技术特征:

1.一个基于目标模型的日志记录和错误分析工具(即jllap),特征在于:由两部分组成,即loglint和loganalyzer,这两部分都是基于目标模型实现的。此工具设计为intellijidea的插件,在实时模式下工作。在intellijidea中安装成功后即可使用。在使用过程中,loglint部分在开发人员编写代码的同时,会根据树形结构目标模型和其他几个日志记录规则自动扫描当前代码。当检查到特定位置中缺少日志记录语句时,会高亮显示缺少日志记录语句的代码段,并且通过名为”快速修复”的功能,让开发人员可以根据代码上下文方便地插入日志语句。当软件运行中出现故障时,loganalyzer部分会利用以模板形式描述的树形结构的目标模型将日志分为一组目标和任务,最终将日志文件转换为目标树,从而捕获软件系统的主要执行状态以帮助开发人员缩小故障位置。至此,日志记录和日志分析实践将形成一个闭环,其中日志规范化记录提供高质量日志以改进日志分析,而日志分析结果反过来促进日志记录的规范化。

2.根据权利要求1所述的工具,其特征在于,用来表示软件执行的抽象结构的目标模型是一种树形结构。此模型将开发人员打算从日志文件中获取的内容描述为目标是树形结构的根节点,目标的组成部分描述为任务是树形结构的子节点。其中一个目标可以被划分成多个任务,并且一些任务可以进一步被分为子任务。而作为树的节点,目标和任务都有自己的预置模式和后置模式,分别表示自己的开始条件和结束条件。每一个任务和目标都可以用状态来描述,指示任务或目标是否完成执行,或者是否有任何类型的故障或异常。共有四种不同的状态:正常状态代表目标或任务是完整无误的;错误状态代表目标或任务完成,但包含错误;前置缺失状态代表目标或任务缺失预置模式;后置缺失状态代表目标或任务缺失后置模式。

3.根据权利要求1所述的工具,其特征在于,用来扫描代码的日志记录规则包括:断言检查、异常检查、关键分支检查、线程相关检查、服务器相关检查、数据库相关检查、关键类和方法检查。且根据这些代码规则检查项,设计了相应的系统模块,这些模块承担着扫描且检查代码,并根据对应规则判断是否缺失日志记录语句的职责,具体实现上,loglint获取当前代码的ast(抽象语法树),然后利用正则表达式匹配来检查缺少的日志记录语句。

4.根据权利要求1所述的工具,其特征在于,名为”快速修复”的功能,是由intellijidea提供支持的。这个功能在loglint发现特定位置缺少日志记录语句时,将会以提供一个“快速修复”列表的形式来让开发人员可以根据代码上下文方便地插入所缺失的日志语句,而且还能够为开发人员提供日志记录语句的推荐内容和级别。此外,它支持大多数基于java的日志库,例如log4j、slf4j、javautil日志记录等。

5.根据权利要求1所述的工具,其特征在于,以模板形式描述的树形结构的目标模型主要是以结构化的伪代码形式详细描述每个目标的名称、前置条件和后置条件以及组成此目标的任务。而每个任务也需要详细记录它的名称、前置条件和后置条件,而当某个任务有子任务时,也需要详细记录下来。

6.根据权利要求1所述的工具,其特征在于,利用将日志分为一组目标和任务主要是,loganalyzer部分会逐行扫描整个日志文件,并确定日志是否与模板(即预定义的目标模型)匹配,然后根据模板将每条日志分组至目标或任务,最终将日志文件转换为目标树。

7.根据权利要求1所述的工具,其特征在于,捕获软件系统的主要执行状态主要是,loganalyzer部分会确定每个目标或任务的状态,然后根据目标或者任务的状态来分析系统运行情况:目标或任务是错误状态时,可能是因为它或它的子任务包含异常调用堆栈或是error级别日志等;当是正常状态时,可能因为是它或它的子任务包含低于安全级别的日志且无异常;当是模式缺失状态时,可能是因为日志与模式不匹配(缺失前置或者后置模式)。从而找出程序的执行逻辑和路径,并根据执行逻辑和路径的对应状态分析出故障原因。

8.根据权利要求1所述的工具,其特征在于,日志记录和日志分析实践将形成一个闭环主要是在loglint的帮助下,开发人员可以或多或少地标准化他们的日志记录实践,并为后续日志分析提供更有效的信息。loganalyzer还可以丰富loglint的检查规则,并最终形成良性的闭环。

技术总结
一个基于目标模型的日志记录和错误分析工具(即JLLAP),由两部分组成,Log Lint和Log Analyzer,设计为Intellij IDEA的插件,在实时模式下工作。此工具将日志记录和日志分析实践将组成一个闭环,其中日志规范化记录提供高质量日志以改进日志分析,而日志分析结果反过来促进日志记录的规范化。

技术研发人员:薛冰冰;荣国平;邵栋;张贺
受保护的技术使用者:南京大学
技术研发日:2019.03.01
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-27548.html

最新回复(0)