首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

一种面向工控系统日志的高压缩比压缩算法 

申请/专利权人:四川大学

申请日:2023-01-03

公开(公告)日:2024-07-05

公开(公告)号:CN118295980A

主分类号:G06F16/174

分类号:G06F16/174;G06F16/18;G06F11/14;H04L41/069;H04L69/04;H04L69/22

优先权:

专利状态码:在审-实质审查的生效

法律状态:2024.07.23#实质审查的生效;2024.07.05#公开

摘要:本发明的核心思想是减少原始日志文件中包含的冗余信息,具体包括:使用正则表达式拆分日志头和日志消息;对日志头执行启发式的字段提取;对日志消息进行模板提取;对参数进行映射处理;使用通用压缩工具对中间对象压缩。本发明针对工控设备日志头和日志消息分别设计了高效的压缩算法。此外,为了增强针对小日志文件的压缩比,对日志的模板提前进行预处理并存储,解决了传统日志压缩算法需要从待压缩文件中提取,由于文件太小导致模板的提取准确率低,进而导致压缩比不高的问题。此外,相对现有的日志压缩算法,也在一定程度上提高了压缩速率。

主权项:1.一种面向工控系统日志的高压缩比压缩算法,其特征在于,所述方法包括如下步骤:1使用正则表达式拆分日志头和日志消息,日志格式大体框架相同,但存在自定义部分,目前业界比较流行的日志系统的数据格式普遍是基于RFC3164协议,拥有相对规范的日志格式,它包含了日志头时间部分和日志消息体其余部分,它符合了日志两段体的格式;2对日志头执行启发式的字段提取,对于日志头来说,其最大的特点是格式比较固定,其次是遵循一定的局部性原理,即在相邻的日志中,它们的一些字段比较接近或相等,并且,日志头不像日志消息的自定义性那么强,因此不能采用相同的方法处理;3对日志消息进行模板提取,基于迭代聚类思想的自学习智能算法,它只需要从部分历史日志中高效地提取隐藏模板,并可以匹配全部的日志记录,提高了匹配的准确率;4对参数进行映射处理,通过参数映射方法进一步优化参数的存储方式,从而减少参数的重复存储;5使用通用压缩工具对中间对象压缩,在经过前面的多级处理包括编码和映射之后,生成了一系列的中间对象,最后一步是将这些对象全部无损地压缩和打包到压缩文件中;进一步地,所述步骤2中首先从日志配置文件中读取开发者预设的正则表达式,然后利用该正则表达式从日志中将数据的不同字段如年、月和日提取出来,例如,在LOG4J日志框架中,日志语句的格式可以指定为“%dyyyy-mm-ddHH:mm:ss,SSS-%p-%c1-%m%n”,通过解析表达式,可以提取出年月日、时分秒、日志级别、记录日志的组件和日志消息内容,将相似的字段通过按分隔符如空格和分号划分,以便于进一步处理,在此步骤中,对于每一条日志,还需要将日志行拆分为字符串数组,因此整个日志文件转变成了一个矩阵表,然后对该矩阵进行转置,此外,对于无法通过预定义的日志格式匹配的日志行,则直接将其附加到前一个的日志行中,进一步地,所述步骤2中包含三个过程,1提取相同的字段:对于具有相同字段的列,我们从这些列中提取相同的字段并计算这些字段的出现次数,而对于只出现1次的,保持原样输出,对于出现频率不是那么高的字段,通过构建每个字段的字典,将它们映射成更短的编码,并在原内容中替换字段,使得具有较短表示的字段,2数字增量编码:对于时间戳等短时间内比较接近的数字型字段,通过计算当前字段和其前一个字段之间的增量来进行增量编码,保留其中的第一个字段,而后面的字段仅保留增量,因此,具有长文本的字段被替换为较短的表示,3共享字符串公共前缀:对于具有公共前缀字符串的字段,首先提取字符串的公共前缀,并仅存储每个字符串的剩余部分,将同一列转置后的同一行的字段提取最长公共前缀字符串,然后按顺序存储不同的公共部分,对于剩余部分,可以采用相同的算法再次执行,直到无法找到共同前缀,进一步地,所述步骤3中算法的输入是由原始日志消息组成的日志文件,输出则是提取到的隐藏模板和结构化日志,更具体的,在算法的迭代过程中,首先对输入的日志消息进行随机小样本的采样,然后进行聚类流水线进行多级聚类,将样本日志分成多个聚簇,然后对不同的聚簇进行模板提取,在模板匹配过程中,尝试使用已提取到的隐藏模板来匹配所有尚未采样的日志,将匹配失败的日志记录下来,并将它们作为下一次迭代中的输入,在每次迭代结束时,该算法可以成功提取到几个可以匹配所有采样日志的模板,而这些模板可以匹配未采样日志中的大部分,但某些日志消息可能仍然无法匹配,因此,重复上述步骤即采样、聚类、提取和匹配,每次都提取出新的日志模板,在持续迭代数次以后,直到所产生模板能够匹配的日志消息与全部日志消息的比值达到用户定义的阈值通常设置为0.9,为了避免更极端的情况,如每个日志的模板都不一样,此时最大迭代次数取决于全部日志数量,因此,还可以设置最大迭代次数,防止迭代爆炸的产生,在调研后发现,工控系统的日志消息格式变化程度很小,因此本算法过程可以一次性地为某工控系统产生模板,也就是说,可以先在工控系统的一部分历史日志上执行模板提取算法,并将收集到的模板进行使用,避免实时生成模板对实时性造成影响,一旦提取到日志模板并存储到持久化容器中,后续的模块即可读取容器中的模板然后直接匹配而不再需要运行迭代算法从文件中提取日志模板,进一步地,所述步骤3中多级聚类分为4个过程:1按照等级聚类:同一聚簇集合中的日志它们具有相同的级别,所以首先将日志先通过等级划分为不同的聚簇;2按照组件名称聚类:然后考虑不同的设备或者组件,它们由于功能的差异,产生的日志也会有巨大的差异,因此根据组件名来进行分类,确保工控系统中不同组件生成的日志不在同一聚簇中,因此,这一步通过组件名进一步将具有相同级别的日志再一次划分;3按照高频标志词聚类:通过分析日志发现,日志的常量部分通常比其参数部分出现的次数更多,这是因为在源代码种日志通常有一个确定的模板,通过传入不同的参数产生不同的日志,因为参数部分可能因日志记录语句的执行而变化,而常量部分则不变,因此,将具有相同频率的标志词的日志划分到一个聚簇中是合理的,有助于后续过程提取模板,为此,首先使用用户预设的系统分隔符如逗号来拆分每个日志消息并统计到标志词列表,从而得到每个标志词的在采样日志中的频率计数,之后,我们找到每一行日志的前最频繁的标志词,通过它对不同的日志再次进行划分最终在此步骤完成后,被划分到同一个聚簇的日志将具有相同的频率最高的标志词,同样的,再对第二频率,第三频率的词使用同样的方式进一步划分,这里主要是通过经验值来决定,通过实验发现,划分三次是比较适合的,其同时兼顾了性能和分类的有效性;4根据最长公共子序列长度聚类:文本的相似性可以表示为φa,b=|a∩b|,其中a和b是两个日志消息,|·|表示序列中的元素数量,换句话说,φa,b是a和b的最长公共字符串长度LongestCommonSubsequence,LCS,如图3,描述了第四级聚类的工作流程,给定日志消息MSG,首先将它进行分词,产生一个词数组,然后将该数组与现有的各个模板进行匹配,也就是说,计算每个现有聚簇中的隐藏模板与输入日志消息的相似度,并记录其最大的相似性及对应的模板,如果保持相似度大于θ的阈值,则将输入日志消息添加到该聚簇中,其中,θ=|MSG|2,|MSG|表示输入日志中包含的词数量,在新的日志加入聚簇以后,并将该聚簇的模板更新为LCSMSG,T,其中T是表示某聚簇的原模板;进一步地,所述步骤3中的模板匹配过程,匹配的流程是将每个日志M与不同的模板T进行匹配,如果可以匹配成功,说明日志M存在一个隐藏的模板T,并把日志M添加到模板对应的聚簇中,通过匹配这个步骤,确保全部的日志都有自己的隐藏模板,从而可以利用隐藏模板来辅助提高日志压缩率,传统的匹配策略是转换模板通过将“*”替换为“.*?”来转换成正则表达式,然后使用在每个组合之间使用正则表达式匹配日志消息和模板,因为大量的模板可能导致复杂度过高,为了提高实时性,作者使用所有的隐藏模板构建成前缀树,之后通过在前缀树上进行匹配,将复杂度降低为On,其中n为日志消息长度,在执行所有的匹配以前首先利用模板构建前缀树,前缀树最开始只有一个空节点,每个模板首先需要拆分成字符串数组,然后将每个字符串依次添加到前缀树中,从根节点开始,检查当前节点下是否存在一个包含该字符串的子节点,如果找到,则不再插入该字符串,并进入该子节点,然后对下一个字符串进行相同的操作,如果不包含当前待插入的字符串,那么就需要插入一个新的子节点,这个子节点包含了待插入的字符串,再在子节点上进行相同的递归操作,最后需要注意的是在每个节点的使用“$”表示结尾,将所有模板放入同一棵前缀树,并且由于不同的模板可以有多个前缀标记是共同的,它们的路径可能重叠,这也降低了模板所需的存储空间,由于共享了前缀字符串,日志消息在前缀树中搜索时同时与所有模板进行比较,比如,一个日志消息,首先将它拆分成字符串数组,将它的第一个词到最后一个词依次与树中的节点进行比较,对于第一个词,搜索它是否存在于树的第二层树的第一层是一个空节点,如果第一个词匹配一个节点,继续检查第二个词和第三层的节点,当所有词都被成功匹配时,这时候会读取到“$”节点,表示成功匹配模板,否则不匹配,该算法与Trie树比较类似,但是有一个改进的点,由于日志模板中的“*”表示参数具有可变长度,因此我们在树中的“*”节点需要特殊处理,它可以匹配多个单词,如果没有“*”的子节点匹配下一个日志,则多于一个标记词,进一步地,所述步骤4中的参数映射方法进一步优化参数的存储方式,从而减少参数的重复存储,据分析,一些原子不可分割的和较长的参数浪费大多空间,某些字段占用的存储空间很大,并且可能出现的频率也很高,为了压缩此类数据,将字段编码为64位的长整型整数,形成参数映射字典键是参数序号PID,值是相应的参数,为了使空间利用最大化,所有聚簇的参数共享同一个参数映射字典,然后将每个参数编码成PID,最后,再为每个聚簇分别生成参数映射字典对象和每个聚簇的参数对象,以方便解压的时候使用,进一步地,所述步骤5中,在经过前面的多级处理包括编码和映射之后,生成了一系列的中间对象,最后一步是将这些对象全部无损地压缩和打包到压缩文件中,该压缩算法的整体压缩速率主要取决于上述三个等级的压缩,因为在该步骤中直接利用了那些现成的压缩算法和工具,例如GZIP,BZ2和LZMA,通过这种方式,成功复用了现有的技术,兼容了现有的压缩工具和算法,对于解压缩,则是日志压缩的反向过程,它能够恢复日志的原始结构,并保证不会丢失任何信息,首先,对压缩文件解压缩后生成多个对象参数对象、映射字典、模板等,然后,通过按照反方向的步骤进行恢复,使用提取字段的反向步骤恢复日志头,而要恢复日志消息则首先通过使用模板TID去映射字典中获取隐藏模板,类似的,通过使用参数ID到编码字典来检索参数值,通过使用参数替换模板中的“*”,即可完全恢复消息内容,最后将日志头和日志消息进行拼接,即完成了整个步骤。

全文数据:

权利要求:

百度查询: 四川大学 一种面向工控系统日志的高压缩比压缩算法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。