法律状态公告日
法律状态信息
法律状态
2023-05-30
专利权的转移 IPC(主分类):G06F11/34 专利号:ZL2017105530328 登记生效日:20230518 变更事项:专利权人 变更前权利人:西安电子科技大学 变更后权利人:河钢数字技术股份有限公司 变更事项:地址 变更前权利人:710071 陕西省西安市雁塔区太白南路2号 变更后权利人:050035 河北省石家庄市高新区中山东路856号科技创新服务中心1号楼
专利申请权、专利权的转移
2020-07-28
授权
授权
2017-12-22
实质审查的生效 IPC(主分类):G06F11/34 申请日:20170707
实质审查的生效
2017-11-24
公开
公开
技术领域
本发明属于计算机应用技术领域,主要涉及系统异常行为检测,具体是一种基于日志的复杂软件系统异常行为检测的方法,可用于分布式系统的运行维护。
背景技术
随着分布式系统和云计算技术的不断发展,日志规模变得越来越大而不能手动检测以及无结构而不能自动分析,有些操作者通常是制作临时手稿去查询关键字比如“error”以及“exception”等,但是这种手动检测的方法已经被证明在确定问题的时候是不完整、不精确的。然而,在现有的手动检测方法被证明准确率低、异常检测不完整、处理效率低的情况下,目前为止还没有研究出针对该问题高效的、成熟的解决方案。
海尔公司申请的专利“一种基于系统日志的Web系统异常分析方法和装置”(申请号:2014105458425申请日期:2014.10.15公开号:CN104298586A公开日:2015.01.21),公开了一种基于系统日志的Web系统异常分析方法和装置,方法包括实时获取Web系统内的系统日志;根据Web系统内预先设置的分析工具匹配规则和/或系统异常分析指标,分析系统日志的数据是否满足分析工具匹配规则和/或系统异常分析指标;当系统日志的数据满足分析工具匹配规则和/或系统异常分析指标时,确定系统日志异常,将系统日志存储至系统异常库。该方法通过实时获取并分析系统日志,可以及时确定出发生异常的系统日志的数据,但存在的不足是,该方法只能分析到系统发生异常时的日志语句,难以获取导致该异常的日志轨迹,无法根据异常日志语句进行追踪,不能获取导致该异常的根本原因,不利于解决异常。
北京百度网讯科技有限公司申请的专利“异常日志确定方法和装置”(申请号:201510657417X申请日期:2015.10.12公开号:CN105183912A公开日:2015.12.23),公开了异常日志确定方法和装置。所述方法的具体实施方式包括:对每个日志进行分词处理,生成与各日志对应的权重向量,其中,权重向量包括与之对应的日志中的分词,以及与各分词对应的权重;基于与各日志对应的权重向量确定各日志之间的相似度;基于各日志之间的相似度对各日志聚类形成日志类;以及若日志类中包含的异常日志比例超过预定比例,则日志类为异常日志类,否则日志类为正常日志类。该实施方式实现了异常日志的迅速定位。该方法的不足是:能够确定异常日志类和正常日志类,无法准确区分异常日志语句和导致系统运行异常的日志语句,并且聚类方法具有一定的不稳定性。
南京邮电大学申请的专利“基于日志的智能自适应网络故障定位和分析方法”(申请号:2008101241955申请日期:2008.06.17公开号:CN101325520B公开日:2010.08.18),基于日志的智能自适应网络故障定位和分析方法主要由基于优先级的日志预处理方法、基于时间序列的日志事件聚类分析方法和多维日志统计分析方法组成。海量日志信息首先按照优先级别进行分类存储,然后再根据基于时间序列的日志事件聚类分析方法筛选出关键的事件类型即“策略”的获取,随后再运用多维日志统计分析方法将关键的日志信息呈现在界面上,并触发告警判断机制进行实时告警。
这些方法只能分析到系统发生异常时的日志语句,难以获取导致该异常的日志轨迹,无法根据异常日志语句进行追踪,不能获取导致该异常的根本原因,不利于解决异常。而且有些方法中用到聚类算法,但是聚类方法具有一定的不稳定性。
发明内容
本发明针对上述现有技术的不足,提出一种准确性更高的复杂软件系统异常行为检测方法。
本发明是一种基于日志的复杂软件系统异常行为检测方法,包括如下步骤:
步骤1:分析系统源码:将被检测的复杂软件系统的源码作为输入,使用抽象语法树提取源码中可用信息,获得源码的控制流图和日志模板集,其中日志模板为日志打印语句的结构化定义。其次根据源码的控制流图,可得日志模板之间的可达关系。
步骤2:解析日志语句:对标准化的日志消息进行建模,其信息包括日志行号、级别、时间戳和日志模板信息等;采集被检测的复杂软件系统产生的日志语句,进行有效信息提取,并匹配相应的日志模板,得到完整的日志消息。
步骤3:抽取执行轨迹:结合解析得到的日志消息集合,基于日志模板可达关系进行日志执行轨迹提取,并做相应的处理,得到执行轨迹集合。
步骤4:异常检测:采用异常概率树的方法分析运行轨迹集合,将执行轨迹当作数据序列,根据序列与整个网络之间的相似度来判断序列数据中是否存在异常,结合日志执行轨迹的拓扑结构和出现的次数进行异常指数的计算。
与现有技术相比,本发明的技术优势:
(1)本发明以被检测的复杂软件系统的源码为入口,实现了一种将系统源码解析为控制流图的方法。通过对控制流图的分析,可以准确获取日志打印语句间的可达关系,使日志语句之间的运行逻辑关系更为明确。
(2)本发明将被检测的复杂软件系统的源码作为输入,通过分析日志打印语句得到日志模板,将该系统产生的日志语句与相应的日志模板进行匹配,并将匹配度最高的日志模板与日志语句进行关联,使得实验结果更为准确,同时克服了聚类算法不稳定性的缺陷。
(3)本发明利用日志打印语句间的可达关系对日志语句进行相应的操作,抽取得到该系统的执行轨迹集合,通过对异常语句进行追踪,可以获取导致被检测系统发生异常的根本原因,填补了现有技术难以获取被检测系统异常时的日志轨迹的不足。
(4)本发明通过异常概率树的方法获得完整的异常日志执行轨迹,实现相对准确的、完整的异常检测和定位方法,方便用户对系统进行异常排查和修改。
附图说明
图1是本发明的流程图;
图2是日志模板可达关系图;
图3是函数调用信息的控制流图。
具体实施方式
下面结合附图对本发明做详细描述。
实施例1
随着科学技术的飞速发展,现代化软件系统的规模变得更加庞大,功能更加完善,结构更加复杂。在这种情形下,软件系统一旦发生故障,可能会导致一系列的连锁效应。目前,有些大规模软件系统的异常行为检测主要是依靠人力排查,这种方法定位问题不及时、缺乏针对性、效率低且不完备。现有技术中也存在着在分析日志的基础上进行系统异常行为检测的方法,但是这些方法只能分析到系统发生异常时的日志语句,难以获取导致该异常的日志轨迹,无法根据异常日志语句进行追踪,而且有些方法中用到聚类算法,聚类方法具有一定的不稳定性。
针对上述现状,本发明展开相关研究,提出一种基于日志的复杂软件系统异常行为检测方法,参见图1,包括如下步骤:
步骤1:分析系统源码:将被检测的复杂软件系统的源码作为输入,使用抽象语法树提取源码中可用信息,获得源码的控制流图和日志模板集,其中日志模板为日志打印语句的结构化定义。其次根据源码的控制流图,可得日志模板之间的可达关系。
步骤2:解析日志语句:对标准化的日志消息进行建模,其信息包括日志行号、级别、时间戳和日志模板信息等;采集被检测的复杂软件系统产生的日志语句,进行有效信息提取,并匹配相应的日志模板,得到对应的完整的日志消息。
步骤3:抽取执行轨迹:结合解析得到的日志消息集合,基于日志模板可达关系进行日志执行轨迹提取;对日志执行轨迹进行处理,定义相似度标准,将基本片段部分相同但重复度不同的片段处理为同一类型的日志执行片段。
步骤4:异常检测:采用异常概率树的方法分析运行轨迹集合,将执行轨迹当作数据序列,根据序列与整个网络之间的相似度来判断序列数据中是否存在异常,结合日志执行轨迹的拓扑结构和出现的次数进行异常指数的计算。
本发明以系统源代码为入口,实现了一种将系统代码解析为控制流图的方法,同时提取出源码中的日志模板。关注日志语句之间的运行逻辑关系代替以往研究中多关注日志语义信息,对日志消息建模进行去噪处理,在该模型的基础上对原始日志语句进行解析。结合结构化的日志消息和源码控制流图进行日志执行的提取,对日志执行轨迹进行处理过滤。
实施例2
基于日志的复杂软件系统异常行为检测方法同实施例1,步骤1中分析软件系统源码,获取日志打印语句间的可达关系,具体包括有如下步骤:
1.1定义控制流图、可达关系图和日志模板的表示形式
定义1:带有函数调用信息的控制流图(Control flow graph with functioncalls):带有函数调用信息的控制流图用GF=(VF,EF)表示,其中:
VF表示控制流图中的节点集合{vf1,vf2,...,vfn},其中每个节点是一个基础节点、日志节点或者是函数调用节点。
EF表示控制流图中的连接定点的边集合{(vfi,vfj),(vfk,vfl),...},每条边都由一对有序节点(vfi,vfj)表示,表示是一条控制路径或者是一条从vfi到vfj的函数调用。
定义2:日志模板可达关系图(Reachability graph):GL=(VL,EL)表示日志模板的可达关系图,其中:
V表示图上的节点集合{vl1,vl2,...,vln},其中每一节点表示一个日志模板ls。
E表示V中节点组成的直接可达关系{(vli,vlj),(vlk,vlm),...},每条边都表示一对有序节点的组合(vli,vlj),表明通过控制流路径或者函数调用使得vli和vlj可达。
定义3:日志模板(Log Statement):为系统源代码中日志输出语句通用的抽象结构,日志模板定义为四元组ls=(id,loc,cons,vars)表示,其中:
id为不同日志模板的唯一标识。
loc表示日志模板的位置信息,包含该日志模板位于的源文件信息和行号,其中源文件信息包括包名、类名和函数名。
cons为该日志模板包含的常量信息,即从该模板输出的所有日志语句的相同部分。
vars表示日志模板的变量部分。
1.2使用控制流分析实现被检测的复杂软件系统源码S向GL的转换
具体包括如下步骤:
1.2.1以文件为单位,使用抽象语法树将系统源码转换为AST节点。
1.2.2以函数入口为起点,递归遍历源码S中的所有函数,获得以函数为单位的控制流图Gc=(Vc,Ec)。重复执行该步骤获得被检测的复杂软件系统源码S的控制流图集合CFGs{G1,G2,...,Gn},如图3所示。
1.2.3创建包含函数调用的控制流图GF=(VF,EF),其中VF={G1.VC∪G2.VC∪...∪Gn.VC},EF={G1.EC∪G2.EC∪...∪Gn.EC}
1.2.4给定任意两个
1.2.5为日志模板创建可达关系图GL=(VL,EL),其中
1.2.6为任意两个节点
本发明以复杂软件系统的源码为入口,将系统源码解析为控制流图,通过控制流图获取日志打印语句之间的可达关系,使日志语句之间的运行逻辑关系更为明确,用于日志执行轨迹的抽取。
实施例3
基于日志的复杂软件系统异常行为检测方法同实施例1-2,步骤2中解析日志语句,将匹配度最高的日志模板与日志语句进行关联,具体包括有如下步骤:
2.1定义日志消息和日志的表示形式
定义3:日志消息(Log Message):为一个日志文件中描述特定系统的执行事件的完整的一行信息,日志消息lm用五元组表示为:lm=(ln,tm,lv,pv,ct),其中:
ln表示日志消息在日志文件中的行号,用来进行异常定位。
tm表示日志消息的时间戳。
lv表示日志消息的级别,可为DEBUG、INFO、WARN、ERROR和FATAL。
pv=(ls,tid)表示日志消息的源信息,其中ls为打印该日志语句的日志模板,tid表示输出该日志语句的线程名。
ct表示人工可识别的表达语义的日志语句打印内容。
定义4:日志(Log):日志L=(lm1,lm2,...)表示一组具有
2.2日志解析过程
日志文件中的每个日志消息lm的解析过程包含以下四个步骤:
2.2.1构造一个简单表达式提取lm的ln、tm、lv、pv.tid、ct。
2.2.2通过删除lm.ct中所有的数字和特殊标识构造一个查询指针。
2.2.3使用查询结构搜索该指针并且对获取到的集合进行排序。
2.2.4从获取到的排好序的列表中进行反向查询返回结果,并且将匹配度最高的模板和lm.pv.ls进行关联。
本发明通过分析日志打印语句得到日志模板,将该系统产生的日志语句与相应的日志模板进行匹配,并将匹配度最高的日志模板与日志语句进行关联,使实验结果更为准确,同时克服了聚类算法不稳定性的缺陷。
实施例4
基于日志的复杂软件系统检测方法同实施例1-3,步骤4中的轨迹抽取过程,具体包括有如下步骤:
4.1定义关联日志消息、轨迹、关联轨迹和有效轨迹的表示形式
定义5:关联日志消息(Homologous log message):给定两个日志消息lmi和lmj,如果满足lmi..pv.ls=lmj..pv.ls,则用表示lmi和lmj关联。
通过可以输出日志消息的日志模板得到两个日志消息的关联关系,一对关联日志消息可能来源于两个正在执行的不同线程下的相同日志模板,也可能来源于同一线程下相同日志模板的两次输出,因此本发明定义一个函数CountL(lmi,lmj)用来判定和计算两个日志消息的关联关系:
定义6:轨迹(Trace):一个执行轨迹T为L的子集,仍然满足
定义7:关联轨迹(Homogeneous trace):给定两个轨迹Ti和Tj,如果存在f:Tj→Tj,其中,就说Ti和Tj是关联的,记为Tj≈Tj。
类似的,一对关联轨迹可能来自两个正在执行的线程的相同日志片段,也可能来自同一线程中两次执行的相同片段。为了判定和合并任意两个关联轨迹,本发明定义一个有效函数CountT(Ti,Tj)来进行计算:
定义8:有效轨迹(Valid trace):给定一个轨迹T和相应的源码S,如果在S和T之间存在关系“imply”,表示为S|-T,称T为有效的。这里“imply”表示T为源码S中获取到的轨迹中的一条。
4.2轨迹抽取过程
该过程的目的为将日志文件切分为任意数量的日志执行轨迹。给定包含n日志消息的日志文件L={lm1,lm2,...,lmn},本发明需要获取L的m条片段TS={T1,T2,...,Tm},其中
对此,本发明提出一个执行轨迹抽取算法,步骤如下:
4.2.1根据每条日志消息中的tid属性,将L分割为k部分P={P1,P2,...,Pk},
4.2.2根据时间戳将日志消息分组。
4.2.3对于P中的每个
4.2.4执行
4.2.5
4.2.6TS=TS∪{T},
4.2.7若
4.2.8若
本发明利用日志打印语句间的可达关系对日志语句进行相应的操作,抽取得到该系统的运行轨迹集合,通过对异常语句进行追踪,可以获取导致被检测系统发生异常的根本原因,填补了现有技术难以获取导致被检测系统发生异常的日志轨迹的不足。
实施例5
基于日志的复杂软件系统异常行为检测方法同实施例1-4,步骤5中的异常检测,具体包括有如下步骤:
5.1定义异常指数值计算公式
给定一个轨迹的集合T S={T1,T2,...,Tn},每一条轨迹Ti={lm1,lm2,...,lmm}的异常指数值:
Fa表示T>
|Ti|表示Ti的长度,Ti中日志消息的数量;
5.2异常检测过程
输入:一个轨迹的集合T S={T1,T2,...,Tm}共m条轨迹;阈值freqmax。
输出:异常轨迹的集合ATS。
5.2.1初始设置Fa←0;ATS←0;所有的
5.2.2更新T S中每条Ti的
5.2.3更新Fa值。
5.2.4更新T S中每条Ti的每条lmj的pi。
5.2.5更新每条Ti的
5.2.6将
5.2.7挑选
本发明通过异常概率树的方法获得完整的异常日志执行轨迹,实现相对准确的、完整的异常检测和定位方法,方便用户对系统进行异常排查和修改。
下面给出一个更为详尽的例子,结合附图和实验数据对本发明做进一步的详细描述。
参照图1,本发明的具体实现步骤如下:
步骤1,源码分析获取日志模板间可达关系。
使用控制流分析实现源码S向GL的转换。该过程需要执行以下6个步骤,获得日志模板可达关系图如图2所示:
步骤1.1以文件为单位,使用抽象语法树将系统源码转换为AST节点。
步骤1.2以函数入口为起点,递归遍历源码S中的所有函数,获得以函数为单位的控制流图Gc=(Vc,Ec),如图3所示。重复执行该步骤获得源码S的控制流图集合CFGs{G1,G2,...,Gn}。
步骤1.3创建包含函数调用的控制流图GF=(VF,EF),其中VF={G1.VC∪G2.VC∪...∪Gn.VC},EF={G1.EC∪G2.EC∪...∪Gn.EC}
步骤1.4给定任意两个
步骤1.5为日志模板创建可达关系图GL=(VL,EL),其中
步骤1.6为任意两个节点
步骤2,日志语句解析。
表1所示为一条日志模板的结构表。
表1日志模板结构表
表2所示为一条日志消息的结构表。
表2日志消息结构表
日志文件中的每个日志消息lm的解析过程包含以下四个步骤:
步骤2.1构造一个简单表达式提取lm的ln、tm、lv、pv.tid、ct。
步骤2.2通过删除lm.ct中所有的数字和特殊标识构造一个查询指针。
步骤2.3使用查询结构搜索该指针并且对获取到的集合进行排序。
步骤2.4从获取到的排好序的列表中进行反向查询返回结果,并且将匹配度最高的模板和lm.pv.ls进行关联。
步骤3,日志执行轨迹抽取。
该过程的目的为将日志文件切分为任意数量的日志执行轨迹。给定包含n日志消息的日志文件L={lm1,lm2,...,lmn},我们需要获取L的m条片段TS={T1,T2,...,Tm},其中
对此,本发明提出一个执行轨迹抽取算法,步骤如下:
步骤3.1根据每条日志消息中的tid属性,将L分割为k部分
P={P1,P2,...,Pk},
步骤3.2根据时间戳将日志消息分组。
步骤3.3对于P中的每个
步骤3.4执行
步骤3.5
步骤3.6TS=TS∪{T},
步骤3.7若
步骤3.8若
步骤4,计算每条轨迹的异常指数值
计算方法如下:
Fa表示T>
|Ti|表示Ti的长度,Ti中日志消息的数量;
步骤5,基于统计学的异常概率树方法过滤异常执行轨迹。
输入:一个轨迹的集合T S={T1,T2,...,Tm}共m条轨迹;阈值freqmax。
输出:异常轨迹的集合ATS。
第5.1初始设置Fa←0;ATS←0;所有的
第5.2更新T S中每条Ti的
第5.3更新Fa值。
第5.4更新T S中每条Ti的每条lmj的pi。
第5.5根据步骤4更新每条Ti的
第5.6将
第5.7挑选
经过上述五个步骤,获得hadoop的异常检测实验结果如表3所示。
表3实验结果
本发明公开了一种基于日志的复杂软件系统异常行为检测方法,解决现有方法只能分析到系统发生异常时的日志语句,无法根据异常日志语句进行追踪的问题。具体包括:采集系统源代码,将源码转换成以函数为单位的控制流图,抽取日志模板,获取日志打印语句间可达关系;用日志语句间运行逻辑关系对日志消息解析;结合结构化的日志消息和源码控制流图进行日志执行轨迹提取并处理过滤,实现相对准确的、完整的异常检测和定位。本发明分析源码得到日志模板,实验结果更为准确,克服了聚类算法不稳定性的缺陷。抽取日志轨迹,根据异常语句追踪,便于获取导致系统发生异常的根本原因进而解决异常问题。用于分布式复杂软件系统的运行维护。
机译: CLASS认知负载自适应软件系统。一种复杂的软件系统和方法,用于管理基于认知负荷理论的循证策略而不断改进的人类学习。
机译: 基于运行时分析的软件系统日志记录
机译: 基于运行时分析的软件系统日志