SPINE日志解析

摘要

        日志解析,即提取日志模板和参数,是自动化日志分析技术的关键前提步骤。通过研究真实日志数据的特征并分析现有日志解析器的局限性,发现了两个问题。首先,将日志解析器扩展问题;大量的日志,特别是在日志数据极度不平衡的真实场景中。其次,现有的日志解析器忽略了用户反馈的重要性,这对于在日志数据不断变化的情况下进行解析器微调是必要的。本文提出SPINE,具有用户反馈指导的高度可伸缩日志解析器。在日志解析器的基础上,提出了一种新的日志数据调度算法,以提高大规模不平衡日志数据下的并行化效率。此外引入了用户反馈,使解析器能够快速适应不断变化的日志。在16个公共日志上对SPINE评估。平均解析精度超过0.90,解析效率最高,超过了最先进的日志解析器。

介绍

        日志记录重要的系统事件和运行时状态,为开发人员和操作人员提供第一手信息。日志数据量的快速增长和不同日志事件之间复杂的依赖关系对人工日志分析提出了很大的挑战。有必要在自动化日志分析方面进行研究,如基于日志的异常检测、故障诊断、故障预测、日志压缩等。现有自动化日志分析方法所依赖的关键前提步骤:日志解析,将半结构化控制台日志转为结构化格式。

        日志解析定义为从原始日志消息中提取日志模板和参数。日志消息通常包含一个固定的报头,包括时间戳、详细级别和组件名称等信息。日志正文通常由两部分组成:

        1)模板——描述系统事件的静态关键字,显式地写在日志语句中;

        2)参数——在运行时变化的动态变量。

        由于日志头的模式相对静态,可以通过正则表达式很容易地区分出来。日志信息正文由两部分组成:模板“正在运行任务<*> in stage <*> (TID<*>)”,其中“<*>”为占位符;日志参数分别对应模板中的占位符。

        日志解析的一个简单想法是将日志消息与相应源代码中的日志语句相匹配。但源代码并不总是可访问的,特别是对于第三方或专有库。为了克服这个问题,仅依赖于生成的日志数据的日志解析器近年来开始蓬勃发展。

        现有日志解析器已经在公共日志数据集上实现了很好的准确性,但仍有许多问题。首先,大多数现有的日志解析器只能在单线程模式下运行。而实际中,日志数据具有巨大的数据量,超出了任何单个核心或节点的处理能力,特别是在实时日志分析场景中。而且真实日志数据的内在不平衡性质会严重阻碍并行化效率。其次,日志解析器随着生成日志的系统升级而不断更新。模型参数也需要不断调整以适应新的日志,否则解析精度会逐渐降低。现有日志解析器的模型调优复杂又费力,需要基于手动标记日志的大型验证集进行繁琐的超参数调整。因此需要设计一种新的日志解析器,可有效并行扩展,并保持用户干预的轻量级性。

        本文提出了一个具有反馈指导的高度可伸缩的日志解析器,即SPINE。针对日志数据量大,特别是日志数据不平衡的特点,提出了一种新的并行解析调度算法。设计了一个基于成对标记的反馈模式。SPINE有选择地使用成对的日志来查询用户反馈,从而最大限度地提高精度。在不启用用户反馈的情况下,SPINE已经达到了超过0.9的平均解析精度,这大大超过了最先进的日志分析器。在仅启用十几个反馈迭代后,对于那些精度相对较低的数据集,精度可以进一步提高高达30%。在效率方面,与其他日志解析器相比,单执行器SPINE实现了更高的吞吐量,即每秒50,000个日志。并行可以达到每秒处理20万条日志。

日志研究

        云平台每天产生数百亿条日志。仅对于研究中的单个日志源,平均每天产生约50亿条日志消息,这意味着每小时大约产生2亿条日志。如此庞大的日志数据量给日志解析器和后续的日志分析任务带来了巨大的压力。而且日志数据通常具有极端不平衡的特征。在24小时内采样0.01%的日志数据,用Drain获得初始解析结果,手动校准。下图显示了不同模板下日志数量的直方图。

x轴表示模板ID, y轴表示模板对应的日志数(对数刻度)。大多数日志都集中在最上面的几个日志模板上。前10个日志模板占总日志的74.9%。

日志解析器必须能够有效地处理大量且不平衡的日志数据。即使现有的解析器在算法设计阶段进行优化,单个线程或节点仍然无法满足面对大量日志数据的性能要求。因此需要一个日志解析器,允许解析过程横向扩展到许多执行程序。

        可随机分割数据,使之成为大小相等的数据块。分配不同数据块跨运行在现有日志解析器的执行器。但会导致不同执行程序的解析结果不一致,即具有相同模板的日志解析方式不同。根据前缀令牌散列将日志分配给执行程序可以缓解不一致问题。因为具有相同前缀令牌的日志消息可能具有相同的日志模板,因此它们将在相同的执行器中处理。

        但日志数据的不平衡性,并行任务的执行时间由时间最长的子任务决定,在这种情况下,处理具有相同前缀令牌的日志的最大子集。根据前缀令牌将日志分为日志组。之后使用一种新的数据调度算法优化并行解析日志数据的性能。

        不断变化的日志数据促使定期对日志解析器进行重新训练,以保持良好的准确性。现有的日志解析器通常采用无监督的方法,如聚类、频繁模式挖掘、最长公共子序列提取来识别公共部分作为模板。模型参数(如聚类数量或频率阈值)需要不断调整,否则会导致精度下降。参数调优的成本,通常需要足够的标记日志作为验证集,并对所采用的解析方法有深入的理解,以前要么被忽略了,要么被忽略了。本文提出了一个轻量级用户反馈模式,不要求用户对解析模型有深入的了解。目标是尽量减少反馈查询的数量并提高准确率。

SPINE

        SPINE有两个阶段:离线训练(红色箭头)和在线解析(绿色箭头)。

        离线训练阶段,SPINE根据先前收集的训练数据训练一个模型。

        在在线阶段,假设新生成的日志数据被缓冲成批,日志数据将成批解析。

        SPINE由预处理、初始分组、渐进聚类和在线解析四个部分组成。

        预处理执行令牌分割和日志清理。

        初始分组的目的是将日志消息快速划分为粗粒度不相交的日志组。对每个日志组使用渐进聚类算法,将相似的日志进一步划分到不同的日志聚类中。一个日志集群中的日志可能来自同一个日志语句,将通用标记提取为模板。

        在线解析阶段,SPINE直接对输入的成批日志应用学习到的模型(即集群及其提取的集群)。新到达的日志先进行预处理,并将其分配到日志组中,根据日志与所有集群模板之间的相似性将它们放入现有的日志集群中。

        工业日志数据的一个特殊挑战是其极端不平衡。因此设计了一种调度算法来平衡不同解析器执行器的工作负载,以最小化执行时间。

        对于数据演变,SPINE整合了用户反馈以保持一致的解析精度。在日志演化下持续调优解析器参数是一项繁琐而费力的任务。需要对解析模型有很好的了解,并需要大量作为验证集的标记日志。因此设计了一个用户友好的轻量级交互过程,旨在最大限度地减少用户查询的数量,同时最大限度地提高准确性。

预处理

        在SPINE中,先将每个日志消息分解为一系列标记。不仅依赖于广泛采用的分隔符(如空白),还依赖于一些特殊符号(如“:”和括号)。但不能单纯应用分隔符。通过使用简单的正则表达式来考虑公共上下文模式。例如,“uid:12345”中的“:”显然是分隔符,而在“开始于2022-03-04T12:24:11Z”中不应将其视为分隔符。

        日志清理,屏蔽一些常用的参数,如IP地址、guid、文件路径等。也可根据日志数据的特点指定正则表达式列表。

初始分组

        预处理后,使用初始分组对相似日志进行粗粒度分组。使用基于前缀令牌的初始分组。具有相同的前k个令牌的日志消息属于同一个日志组。即假设:具有相同前缀令牌的日志消息可能共享相同的日志模板。还可以考虑其他日志属性,如日志长度、组件名称和详细级别。具有相同属性值的日志将进一步归入同一日志组。生成的日志组之间是互斥的。因而可以在多个执行器上独立地分配它们以并行运行。

渐进聚类

        日志消息已分为互斥的日志组。一个日志组中的日志可能属于多个日志模板。需进一步将日志划分为更细粒度的日志簇,以提取日志模板。日志数据量巨大,复杂的聚类算法通常是不可接受的。因此借用了一种高效且渐进的聚类方法的思想,迭代地将日志消息划分为二分的子组。在没有限制的情况下,分区最终可以将一组日志划分为簇,每簇只含一条日志。

        在每个日志组中,先将日志转换为独热编码向量。之后利用元聚类方法(例如K-Means或高斯混合聚类)对日志向量进行聚类,将它们聚成两个子组。同样的过程在每个子组上继续迭代,直到满足停止条件,获得二叉聚类树,将叶子节点作为日志聚类,渐进式聚类的时间复杂度近似于O(p * n),n是日志数,p表示分区数,通常p << n。

        停止标准:令牌饱和。在每次迭代中需要做的唯一决定是是否停止将一个节点划分为两个子节点。停止准则对聚类树的生长起着关键作用。SPINE采用令牌饱和度作为停止准则。饱和标识:一组日志中在所有日志中都出现的标识。如下图,红色标记是相应树节点中的饱和标记。日志 l 的饱和度定义为饱和标识占该日志中所有标识的比率,Sl = |ls|\|l|,ls代表饱和令牌。

        给定任何单个日志的St,计算聚类树上任何节点的平均日志令牌饱和度S。使用平均令牌饱和度来指导渐进聚类过程。平均令牌饱和度S随着树节点深度的增加而单调增加。如果没有限制,叶子节点将只包含相同的日志(即S = 1),导致日志过度聚集。

        由不同的日志语句生成的日志簇的结果在较低的平均令牌饱和值中,因为不同的日志模板不太可能共享许多公共令牌。使用预定义的令牌饱和阈值T在适当的粒度下对日志进行聚类。如果S均值 >= T,该叶节点不再分区。但在不断变化的日志数据下,为不断变化的模型选择最优阈值实际上是不可行的。现有的日志解析器通常基于复杂的超参数调整。参数调优需要深入理解底层解析机制和验证数据集的沉重标记成本,这对于持续演进的日志来说是不实际的。因此需要不时地结合轻量级用户反馈来改进模型。

        模板提取,聚类后,叶子节点中的日志很可能共享同一个日志模板。为每个叶节点分配一个唯一的簇ID。饱和令牌可直接作为日志模板提取。其他令牌被视为参数。

        在线解析:批量处理日志,先进行预处理,将其分配到初始组中。根据相似度得分将其分配给现有的日志簇。每个日志集群有唯一的提取模板。相似度分数定义为公共标记的数量与模板标记的数量之比,sim(l, t) = | l ∩ t |/|t|,其中I和t分别代表日志和模板的交集。计算日志与日志组内所有集群模板之间的相似度得分。选择相似度分数最高的簇(SIMmax),将此日志分配给该集群。日志集群的模板可在添加新日志后更改。饱和令牌可能会变成不饱和令牌,因为令牌可能未出现在新添加的日志中。SPINE在每个日志批处理结束时对所有不匹配的日志进行聚类,形成新的日志集。如果没有相似度分数高于松散阈值(20%)的集,标记日志为未匹配。在解析每批日志后,模型会得到更新。

        数据调度并行化:可伸缩性是面对大量日志的关键属性。不平衡日志下的并行化挑战,由初始分组生成的日志组是不连续的。将不同组中的日志分开,以完全并行的方式处理的,但由于不平衡问题,一个日志组的大小可能比另一个日志组大几个数量级。簇的执行时间与日志量成正比。因此,一些组的解析时间可能比其他组要长得多,一批日志的解析时间由最大的日志组决定,这意味着在日志不平衡的情况下,性能是次优的。

        日志数据调度:由于上述问题,需要设计一种调度算法,将日志解析工作负载更均匀地分布到多个执行程序,实现最佳性能。假设m个日志组gi 分配到n个执行器ei。目标是尽可能平均地分配日志解析工作负载。理想情况下,每个执行程序处理相同数量的avg = Σ|gi|/n日志,|gi|是日志组的大小。

        为此对于大小高于平均值的日志组,需要将它们分成更小的子集,这些子集的日志数量大约为平均值。对于大小低于平均值的日志组,将它们打包在一起,使产生的超集的大小接近平均值。后者本质上是一个经典的最优作业调度问题,应用贪婪装箱算法BestFit。BestFit打包算法的基本思想是迭代地将候选列表中最大的日志组分配给最轻的执行器工作负载。

        伪代码如下图。目标是将m个日志组G分配给n个执行器e。先根据所有日志组的大小按降序排序。然后将大小高于平均值的日志组分割。在for循环中逐一进行拆分。日志的平均数量,记为avg。是在第3行中计算的,基于需要调度的剩余日志数量和未使用的执行程序的数量。对于每个大小超过avg的日志组,需要将其统一划分为h个子集,并分配给相同数量的执行器。更新执行器及左侧日志组,重新计算avg。当所有高于avg的日志组被调度后,直接调用BestFit算法,将所有后续日志组打包到超集中,并将它们分配给其余的执行器。

        属于一个日志组的日志可能在组大小高于平均值时在不同的执行器上进行解析。因此,相同日志组的模型在不同的执行程序上分别更新。要合并由两个执行器生成的两个不同模型,如果两个模型中都有一个日志集群(具有唯一ID),则将两个集群合并为一个集群。结果集群的日志模板是上面提到的两个模板的交集。有些日志可能无法分配到任何现有的日志集群中,特别是由于图3所示的日志演变。在每个批处理结束时,SPINE从不同的执行器收集所有不匹配的日志,并执行渐进式聚类形成新的日志集群。最后在处理下一批日志前,更新后的模型再次广播给所有执行器。

整合用户反馈:在不断变化的日志数据下,需要用户反馈以保持准确性。本文提出基于递进聚类算法的反馈方案。需要考虑是用户友好性和效率。用户应该能够在不了解模型细节的情况下提供反馈。日志解析器的准确性可以通过尽可能少的反馈得到显著提高。

反馈查询:模型构建本质上是为每个日志组构建二叉聚类树的过程。每个叶节点表示一组共享相同模板的日志。影响模型精度的关键因素是是否将一个叶节点拆分为两个子节点。因此引入了静态饱和阈值为停止标准,在实际中不断变化的日志使初始模型参数不适用,导致不正确的解析结果。

        因此引入了用户反馈方案增强节点分裂。反馈过程涉及多轮查询,在离线模型训练期间或在解析每个日志批处理后触发。在每一轮中,SPINE在特定条件下向用户推荐来自同一日志簇的一对日志。用户反馈这对日志是否共享同一个模板。用户反馈帮助SPINE决定是否将相应的集群拆分为两个子集群。SPINE选择下一个需要人工干预来做出拆分决策的日志簇。反馈过程会一直持续,直到交互次数达到用户指定的上限,或者不再有值得查询用户反馈的日志簇。

        如上图5显示了反馈查询的示例,其中一个叶节点分裂为两个暂定集群。SPINE从每个暂定集群中选择两个有代表性的日志来查询用户反馈。用户点击按钮回答“是”或“否”。在本例中,两个日志使用不同的模板,一个关于“正在运行的任务…”,另一个关于“已完成的任务..”。在这种情况下,反馈是“不”。根据用户反馈,SPINE坚持初步聚类结果。在“是”的情况下,SPINE删除暂定聚类。

日志推荐:如何选择用于标记的日志对仍然是一个问题。SPINE基于一个指标进行反馈查询,即饱和增益。之前使用平均日志令牌饱和度S作为停止标准。通常平均令牌饱和度越高,一个集群中的日志就越有可能来自同一日志语句。饱和增益是将一个叶节点分割为两个子叶节点时饱和的增量。计算叶节点的饱和增益Gln,如下式,Scln1和Scln2分别表示两个试验子叶节点的平均日志饱和度。|In|、|cln1|和|cln2|分别是叶节点和两个暂定子叶节点的节点大小。优先查询较大叶节点的用户反馈,即具有更多日志的叶节点。这样可以一次性解决更多的不确定日志。在下式中,用|In|/|ltotal|归一化饱和增益,|ltotal|是日志总数。

        计算每个叶节点的饱和增益。高饱和增益意味着拆分当前叶节点有很大的潜力来提高模型的精度。因此倾向于查询具有高饱和增益值的叶节点的用户反馈。

结论

        本文提出了一个具有反馈指导的高度可伸缩的日志解析器,SPINE。设计了一种新的具有初始分组和逐步聚类的日志解析模型,并在此基础上提出了一种新的日志数据调度算法,以提高大规模不平衡日志数据下的并行化效率。SPINE结合用户反馈,为不断变化的日志数据实现良好的解析精度。在16个公共日志数据集上评估。结果表明,该方法平均解析精度在0.90以上,解析效率较高,优于目前最先进的日志解析器。在微软的生产环境中部署了SPINE,可以在大规模不平衡日志数据下实现接近实时的性能,并且可以在日志演变过程中保持稳定的精度,且用户反馈很少。

参考:

SPINE:高拓展性、用户友好的自动化日志解析新神器

SPINE: A Scalable Log Parser with Feedback Guidance - Microsoft Research

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值