论文阅读:2025-LogGzip: 基于无损压缩的日志解析

论文标题: LogGzip: 基于无损压缩的日志解析

摘要:

对来自物联网(IoT)设备的复杂日志进行自动化分析,有助于故障诊断和系统状态监控。日志解析是此过程的第一步,它将原始日志转换为结构化数据。由于物联网系统日志的庞大规模和复杂结构,解析器必须有效地处理各种日志格式。监督学习解析器需要大量的人工数据标注工作。聚类解析器作为一种无监督方法,最大限度地减少了专家的参与和人工标注。然而,由于现有聚类解析器依赖于特定的日志结构或需要将日志转换为特定的表示形式,因此它们在处理各种日志数据格式和处理日志中的细微变化或噪声方面存在困难。为了解决上述问题,本文提出了一种基于 gzip 无损压缩器的聚类日志解析器 LogGzip。它采用 gzip 压缩器来测量日志之间压缩长度的差异,以识别日志中的复杂模式和规律,并设计了一种压缩距离计算方法来构建一个距离矩阵,作为日志事件相似性的度量。同时,通过构建压缩字典来减少压缩过程中的开销。最后,使用相似度分数进行聚类分析。实验结果表明,LogGzip 的解析准确率优于现有的最先进的日志解析器。

关键词:

日志解析,日志分析,无损压缩

1. 引言

随着物联网设备的广泛部署,它们已成为大规模网络攻击的常见目标,引起了对设备安全的高度关注。为了应对这些挑战,研究人员提出了各种基于系统行为的异常检测方法,通过审查设备和系统日志来识别潜在的恶意活动或设备故障(Wang et al., 2022a)。尤其是在需要高计算能力和低延迟的边缘云协作环境中,日志分析用于提取事件日志中服务之间的时间约束信息,以优化服务配置(Sun et al., 2021)并执行日志压缩(Tian et al., 2022; Wei et al., 2021)。然而,随着软件系统的快速迭代和新设备的引入,挑战也随之增加。日志数据的量正在迅速增长,格式也变得更加多样化,这对日志分析提出了新的要求。例如,Hue (Xu et al., 2023) 是一种为混合日志场景设计的解析器,其中日志可以采用事件日志、表格日志、文本日志等多种格式。因此,它需要一个能够适应多种日志格式的解析器。在这种情况下,更有效的日志解析技术对于应对这一挑战至关重要。

日志解析涉及将半结构化日志转换为结构化格式。然而,物联网环境包含大量的异构设备,导致了多种日志类型。这要求日志解析器能够适应多种格式并有效地推广到新的数据集。不同系统或服务生成的大量和高可变性的日志限制了日志解析器的通用性。日志中单个或多行文本消息的格式完全由日志打印语句决定。此外,在大型系统中,日志内容格式的多样性尤为明显,并且大多数系统仍然生成非结构化或半结构化的自由文本消息 (Zhang et al., 2023)。

为了应对这些挑战,学术界和工业界都进行了大量的研究,旨在提高解析效率和准确性。最近的进展,如 Drain (He et al., 2017)、Logram (Dai et al., 2020)、AEL (Jiang et al.,
和 LenMa (Shima, 2016) 在日志解析领域取得了显著进展。这些研究不仅关注于提高解析准确率,还关注于提高解析器的泛化能力,以适应不断变化的数据集和软件更新的频率。聚类解析器通过提取相似性特征来对日志进行分组。然而,聚类日志解析中的特征提取面临数据中的噪声、由于系统更新和配置更改导致的日志输出变化以及旧模式和新模式的演变等因素的挑战,所有这些都限制了解析技术的有效性和泛化能力。特别是,基于机器学习的解析器,如 FlexParser (Rücker and Maier, 2022) 和 LogStamp (Tao et al., 2022),尽管在特定数据集上表现良好,但在面对未知日志或新模式时可能会降低性能,这主要是由于可能过度拟合训练数据以及缺乏对新情况的泛化能力。聚类日志解析是一种无监督的学习技术,不需要花费大量时间来获取标记数据。它可以自动地从无标记日志数据中发现模式和关系。然而,现有的基于聚类的日志解析器,如 LenMa (Shima, 2016) 和 LogMine (Hamooni et al., 2016),在面对复杂格式或新日志数据时表现不佳。因此,有必要探索一种新的聚类日志解析器,即使面对复杂的新日志数据,它仍然具有良好的泛化能力。

无损压缩技术可以优化数据表示,在不丢失任何信息的情况下消除冗余 (Mathpal et al., 2017)。基于此特性,压缩器可用于识别日志中的冗余信息,以实现日志解析。因此,探索无损压缩在日志解析中的应用是一个新的研究方向。经典的无损压缩算法包括霍夫曼编码 (Huffman, 1952)、Lempel-Ziv-Welch (LZW) (Ziv and Lempel, 1977) 和行程编码 (RLE) (Robinson and Cherry, 1967)。这些算法已被广泛应用于文本和图像等各种数据类型的压缩。Gopinath 和 Ravisankar (2020) 的研究结果表明,对于相同的文本,LZW 技术的压缩率优于其他压缩技术。Deflate 是一种基于霍夫曼编码和 LZW 的压缩算法。它实现了高传输速率和压缩比。Gzip 是一种流行的通用压缩器,它利用 Deflate 算法,擅长处理文本中的重复模式,同时保持较低的计算成本。此外,它在操作系统和编程语言中的广泛支持使其易于集成到现有系统中。因此,我们选择 Gzip 作为在日志解析过程中计算压缩长度的压缩器。

在本文中,我们提出了一种基于无损压缩的新型日志解析器 LogGzip,旨在解决聚类方法无法实现良好泛化能力的问题。LogGzip 利用压缩器发现潜在重复模式和捕获冗余特征的能力,通过比较日志之间压缩长度的差异来识别这些模式,并且 gzip 比其他压缩器更有效地识别文本中的重复模式。与传统方法相比,这种方法利用对整体数据模式的分析,能够有效地推广到新的、未见过的日志,并显著减少过拟合的问题。LogGzip 首先使用标准化预处理来消除影响压缩效率的变量。然后,它使用无损压缩算法计算日志的压缩长度,并基于这些长度创建一个距离矩阵,以量化日志之间的相似性。在此过程中,通过构建压缩字典来重用压缩结果,从而提高解析效率。通过额外的聚类分析,LogGzip 将具有压缩特性的日志消息分组在一起,有效地提取日志模板。基于 Loghub_24 (Li et al., 2024)(从原始数据集 LogHub (He et al., 2020) 校正而来)的 16 个公共数据集进行的广泛实验证实了 LogGzip 的有效性和效率,平均解析准确率为 0.933。实验结果验证了 LogGzip 的有效性和效率。

本文的主要贡献如下:

(1) 据我们所知,LogGzip 是第一个利用基于无损压缩器的日志解析方法,其中计算压缩距离以构建一个稳定和高效的日志解析器,该解析器可以在不同的日志类型中良好地工作。

(2) LogGzip 通过构建压缩字典来提高解析效率,从而重用相同日志的压缩长度。这消除了压缩器冗余的压缩计算,并降低了搜索模板对象的复杂性,从而提高了解析效率。

(3) 没有使用正则表达式的实验表明,LogGzip 在聚类方法中表现出最佳的泛化能力,实现了超过 0.8 的解析准确率。为了证明选择 gzip 压缩器进行解析的合理性,我们研究了几种常见的文本压缩算法,并且经验证据表明 gzip 的性能最佳。

本文的其余部分组织如下。第 2 节介绍相关工作。第 3 节详细描述了所提出的方法。第 4 节给出了实验结果和分析。第 5 节讨论了几种解析器的关键特性以及 LogGzip 的局限性。最后,在最后一节中总结了本文。
好的,这是论文的剩余部分翻译:

2. 相关工作

本节主要回顾日志解析相关的研究和进展。

2.1 日志解析

日志解析涉及将半结构化的原始日志转换为结构化数据。如图 1 所示,日志消息由程序生成,包含时间戳(例如,“081110 000616”)、进程 ID(例如,“4552”)、消息级别(例如,“INFO”)、组件(例如,“dfs.DataNode$PacketResponder:”)和传达语义的内容(例如,“Received block blk_3463540868626173125 of size 67108864 from /10.251.30.134”)。其中,“blk_3463540868626173125”、“67108864” 和 “/10.251.30.134” 代表动态变量(即参数)。解析后,消息模板为 “Received block <> of size <> from <*>”,构成了结构化的日志消息。

2.2 日志解析器的分类

最近的研究表明,数据驱动的日志解析方法在处理大规模日志数据方面是有效的。这些方法主要利用数据挖掘技术来识别和提取日志中的常见模式,根据所使用的技术可分为四种类型:基于启发式的、基于聚类的、基于频繁模式挖掘的和基于机器学习的日志解析器 (Fu et al., 2023)。以下是对近年来这些类型的解析器进行的分析和总结。

(1) 基于聚类的日志解析器。 聚类涉及将数据集划分为不同的组或簇,基于一种度量(例如样本之间的距离)最大化每个组内元素的相似性并最小化不同组之间的相似性。日志聚类计算日志之间的相似性,将具有高相似性的日志聚合到一个组中,并提取它们的通用日志模板。

LenMa (Shima, 2016) 侧重于单词长度特征,并将日志之间的关系转换为相似度分数,用于聚类分析。Paddy (Huang et al., 2020) 构建了一个倒排索引,使用动态字典结构,以高效地搜索具有高召回率的候选模板。它使用 Jaccard 相似度和长度特征对候选数据进行排序,以提高解析准确率。LPV (Xiao et al., 2020) 将日志消息转换为向量,并通过两个向量之间的距离来测量相似性,采用欧几里德距离的凝聚聚类。Prefix-Graph (Chu et al., 2021) 使用前缀图进行增量学习,将历史日志数据插入到图中,然后合并分支,直到图的结构稳定。Prefix-Graph 不需要领域知识,并且具有固定的超参数,因此具有良好的泛化能力。为了提高解析效率,QuickLogs (Fang et al., 2021) 使用 TF-IDF 进行加权,并使用 SimHash 算法和汉明距离合并相同长度的相似模板,同时它对不同长度的模板使用余弦相似度算法。SPINE (Wang et al., 2022b) 采用元聚类方法或高斯混合聚类,从日志向量构建二叉聚类树,并通过决定是否基于用户反馈将叶节点分割成两部分来细化解析精度。

基于聚类的日志解析器利用各种技术,包括倒排索引、Jaccard 相似度、欧几里德距离和凝聚聚类,以提高搜索效率、召回率和解析准确率。这些方法揭示了通过增量学习、元聚类方法或用户反馈机制增强聚类性能和泛化能力的可行性,即使在缺乏领域特定知识的情况下也是如此。

(2) 基于频繁模式的日志解析器。 利用频繁模式挖掘技术的日志解析器通过识别数据集中的重复子序列来对数据进行分类。该方法通常涉及:(a) 迭代日志消息以建立频繁项集;(b) 通过这些集合将消息分组到与相同事件模板相关联的集群中;(c) 从每个集群派生事件模板。

一些日志解析器使用 n-gram 字典进行日志分析。Logram (Dai et al., 2020) 从日志消息标记构建 2-gram 和 3-gram 字典来解析日志。然而,数据集中来自同一模板的日志的单词计数可能会有所不同,并且解析器无法有效地处理。METING (Coustié et al., 2020) 通过将集群递归地划分为分层结构来解决这个问题。它将具有公共 n-gram 的日志分隔到子集群中,当集群内的同质性足够时停止划分。ULP (Sedki et al., 2022) 使用字符串匹配和局部频率分析,最初通过文本处理将日志事件组织成组。随后,它将频率分析应用于组内的实例,以区分日志事件中的静态和动态内容。Spray (Zou et al., 2022) 引入了一种用于实时分析的流日志解析器,利用 LCS 来衡量日志模板相似性,并基于相似性阈值选择合适的模板。为了降低日志解析过程中参数的敏感性,PILAR (Dai et al., 2023) 采用了一种基于熵的方法来计算日志分析的标记概率。

基于频繁模式挖掘的日志解析器利用构建频繁项集、n-gram 字典和频率分析等技术来处理日志数据。这些解析器有效地对日志消息进行分类并提取事件模板,适应了长度变化和不同模板的挑战,基于熵的方法提高了其性能和适应性。

(3) 基于启发式的日志解析器。 基于启发式的日志解析器使用特征和定义的规则对日志消息进行分组,以生成基于分组的事件模板。

AEL (Jiang et al., 2008) 使用匿名化和标记化方法对日志进行分类。ML-Parser (Zhu et al., 2022) 采用多层规则结构框架,该框架集成了前缀树、最长公共子序列、Jaccard 相似度和倒排索引,以平衡效率和有效性。Raynal 等人 (2022) 利用专门的数据结构进行模式级字符串建模,并设计了一种利用模式匹配上下文的编辑距离来通过推断一组正则表达式来解析文本文件。Spell (Du and Li, 2016) 使用最长公共子序列算法提取日志模板。Drain (He et al., 2017) 是一种在线日志解析器,采用固定深度的树结构将日志分类到不同的组中,在开源日志解析器中实现了最佳的组准确性。Drain+ (Fu et al., 2022) 基于 Drain,通过使用统计方法自动生成分隔符,并通过模板相似性合并候选事件模板,以解决由嵌套对象引起的可变长度问题。XDrain (Liu et al., 2024) 通过使用固定深度的森林来解决 Drain 中可变的初始日志问题。Ustep (Vervaet et al., 2021) 向下扩展树结构,直到找到合适的日志模板。Wang 等人 (2023) 开发了一个用于交互式日志分析的人工循环模板挖掘框架,结合了三种轻量级的用户反馈机制。Brain (Yu et al., 2023b) 使用最长公共模式和双向树方法进行解析,但其对离线初始组创建的要求阻碍了对新系统的直接应用。

启发式日志解析器利用前缀树、最长公共子序列、模式自动机和统计分隔符识别来灵活地处理日志数据的可变性和复杂性。用户反馈和交互式分析的集成进一步增强了解析过程的适应性和准确性。

(4) 基于机器学习的日志解析器。 基于机器学习的日志解析是指使用机器学习算法和技术自动处理和分析日志数据。它能够自动发现大型日志数据集中的模式和规律,从而提高日志解析的效率和准确性。

Rand 和 Miranskyy (2021) 开发了一种用于生成合成 Apache 日志的工具,以训练基于递归神经网络的机器翻译 (MT) 模型,这需要大量的数据进行训练。LogDTL (Nguyen et al., 2021) 通过在 DNN 组件中持续学习两项任务来解决准确性和人工标注工作之间的权衡,当使用共享 DNN 参数时,促进从源任务到目标任务的知识转移。FlexParser (Rücker and Maier, 2022) 采用 LSTM 从不断演变的日志消息中提取可靠的事件值,但它只考虑每个日志消息中影响单个字符串的渐进变化。LogStamp (Tao et al., 2022) 采用预训练的双向 Transformer 从日志数据中提取特征表示,并使用 DBSCAN 方法基于其嵌入特征对句子进行聚类。UniParser (Liu et al., 2022) 通过上下文编码器模块编码上下文信息,并使用上下文相似性模块对日志消息进行聚类。Semlog (Yu et al., 2023a) 通过区分常量和变量词对日志语义的贡献来解析日志,并通过 TESC 算法使用其前 k 个语义贡献分数增量地对日志进行分组。VALB (Li et al., 2023) 引入了一种基于深度学习的日志解析方法,该方法识别动态变量的类别并将它们与日志模板一起保存。LogPPT (Le 和 Zhang, 2023) 采用少样本学习和提示技术来训练大型模型,以预测日志中的常量和变量。Log3T (Yu et al., 2023c) 采用基于预训练 Transformer 编码器的模型来提取日志模板,并且可以在解析时更新参数,以通过修改后的测试时训练来适应新的日志类型。LILAC (Jiang et al., 2023a) 利用 LLM 的上下文学习功能,通过实施分层候选采样算法并选择高质量演示。

基于机器学习的日志解析器应用递归神经网络、深度神经网络、长短期记忆网络和 Transformer 等算法来自动识别复杂日志数据中的模式和规律。通过知识转移、上下文编码和语义分析等机制,它们有效地处理了大数据量和动态变化的挑战,展示了机器学习在日志解析中的潜力和灵活性。

日志解析的演变已经从频繁模式挖掘和启发式方法发展到机器学习算法。这些方法利用独特的框架,如 n-gram 字典、前缀树、最长公共子序列和深度学习模型来解决日志数据的多样性、复杂性和动态性。技术进步显著提高了日志解析的效率、准确性和自动化,为日志管理和故障诊断提供了强大的支持,并突出了每种技术在处理大型和复杂日志数据方面的独特优势和互补性。

2.3 问题分析

**日志量的快速扩展及其格式复杂性的增加对日志解析技术提出了重要的挑战。当前的基于启发式的解析器通常依赖于手动制定的规则,而机器学习方法则需要标记数据进行训练,并且可能仅在特定数据集上表现良好。当遇到未见过的日志或由于可能过度拟合训练数据和缺乏泛化能力而导致的新日志模式时,它们的性能可能会下降。基于频繁模式挖掘的方法可能会忽略奇异事件,并且降低阈值可能会引入噪声,导致较差的解析结果。聚类日志解析是一种无监督的学习技术,不需要花费大量时间来获取标记数据,并且可以自动发现未标记日志数据中的模式和关系。然而,现有的日志解析器依赖于日志的特定结构、预构建的索引或需要转换为特定的表示形式。它们无法有效地识别复杂日志数据中的重复模式和规则,从而导致对复杂日志数据集的泛化能力不足。

为了解决这个问题,我们探索使用压缩器来有效地识别日志模式进行解析。该方法利用日志数据中固有的冗余,通过测量日志之间压缩的长度来自动识别模板和异常模式。该算法的基本假设是相似的日志在压缩后尺寸会显著减小。该方法直接从原始日志文本中捕获冗余特征,灵活地适应日志格式的变化,展示了强大的通用性和适应性,并有效地处理大型和不断演变的日志数据。

3.算法流程

核心思想: 利用Gzip无损压缩算法来识别日志中的重复模式和规律性,并以此进行日志解析。

算法流程: LogGzip算法主要包含以下四个步骤:

1. 预处理(Preprocessing):

  • 日志分割(Log Splitting): 使用分隔符(如空格)和正则表达式将原始日志字符串分割成词元(tokens)。
  • 变量过滤(Log Variable Filtering): 使用正则表达式识别并提取日志中的常见变量(如IP地址),并用占位符"(*)"替换。这一步是为了降低变量对压缩效率的影响。

2. 计算压缩距离(Computing Compression Distance):

  • 核心思想: 相似的日志在经过压缩后,其大小应该比不相似的日志更小。
  • Gzip压缩: 使用Gzip压缩算法计算单个日志和组合日志的压缩长度。
  • 公式:
    • 给定两个日志 L1L2
    • C1: L1 压缩后的长度
    • C2: L2 压缩后的长度
    • combined=L1+separator+L2: L1L2 连接后的字符串,separator 是一个分隔符,用于区分两个日志。
    • C12: combined 压缩后的长度
    • 压缩距离(Log Compression Distance, LCD):

      LCD(L1,L2)=max(C12C1C2,C12C2C1)

      LCD通过计算将 L2 添加到 L1 后增加的压缩大小的比例来衡量相似度。取最大值是为了保证距离的对称性,即 LCD(L1,L2)=LCD(L2,L1)

3. 计算相似度得分(Calculating Similarity Score):

  • 目标: 将压缩距离转换为相似度得分,以便进行聚类。
  • 算法:
    • 首先,比较两个日志中对应位置的词是否匹配,计算一个准确度得分 a_score
    • 如果第一个词不匹配,则直接返回相似度为0。
    • 如果 a_score 等于1,表示完全匹配,则相似度为1。
    • 否则,使用LCD计算压缩距离,并将其转换为相似度得分。
  • 公式:
    • T: 两个日志中正确匹配的词的数量

    • S: 一个日志中的总词数

    • 准确度得分(Accuracy Score):

      a_score=TS

    • 相似度得分(Similarity Score, Dsim):

      Dsim=1LCD(L1,L2)

4.模板提取(Template Extraction):

  • 聚类: 使用相似度得分对日志进行聚类。相似度得分高于预定义阈值的日志被归为同一类。
  • 模板生成: 对于每个聚类,通过比较日志消息并用通配符"(*)"替换不同的部分来生成日志模板。

其他关键技术点:

  • 压缩字典(Compression Dictionary): 为了提高效率,LogGzip使用一个压缩字典来缓存模板的压缩长度。压缩字典使用MD5哈希值作为键,模板对象作为值。这样可以避免重复计算相同模板的压缩长度。
  • 阈值(Threshold): 相似度得分的阈值用于确定哪些日志应该被归为同一类。阈值的选择会影响解析的准确性。
  • 评估指标(Evaluation Metrics): 论文使用以下指标来评估LogGzip的性能:
    • 分组准确率(Group Accuracy, GA)
    • 词级别解析准确率(Parsing Accuracy, PA)
    • 分组准确率的F1得分(F1 score of Grouping Accuracy, FGA)
    • 模板准确率的F1得分(F1 score of Template Accuracy, FTA)

总结:

LogGzip通过利用Gzip压缩算法的特性,提出了一种新颖的日志解析方法。该方法不需要预定义的模式,并且能够有效地处理各种日志格式。实验结果表明,LogGzip在准确性和效率方面都优于现有的日志解析器。

示例

我们以一个简化的例子来演示LogGzip的算法流程。

假设有以下3条原始日志消息:

  1. Dec 10 06:55:46 LabSZ sshd[24200]: Invalid user webmaster from 173.234.31.186
  2. Dec 10 06:55:46 LabSZ sshd[24201]: Invalid user admin from 52.80.34.196
  3. Dec 10 06:55:46 LabSZ sshd[24202]: Accepted password for illegal user ken from 192.168.1.1

1. 预处理:

  • 日志分割:

    • L1: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24200]:', 'Invalid', 'user', 'webmaster', 'from', '173.234.31.186']
    • L2: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24201]:', 'Invalid', 'user', 'admin', 'from', '52.80.34.196']
    • L3: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24202]:', 'Accepted', 'password', 'for', 'illegal', 'user', 'ken', 'from', '192.168.1.1']
  • 变量过滤: (假设我们定义了IP地址和用户名是变量)

    • L1: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24200]:', 'Invalid', 'user', '(*)', 'from', '(*)']
    • L2: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24201]:', 'Invalid', 'user', '(*)', 'from', '(*)']
    • L3: ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24202]:', 'Accepted', 'password', 'for', 'illegal', 'user', 'ken', 'from', '(*)']

2. 计算压缩距离:

  • 使用Gzip压缩每个预处理后的日志消息,得到压缩后的长度。

    假设:

    • C1 (L1压缩后) = 100 字节
    • C2 (L2压缩后) = 100 字节
    • C3 (L3压缩后) = 120 字节
  • 计算组合日志的压缩长度(以L1和L2为例):

    combined = ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24200]:', 'Invalid', 'user', '(*)', 'from', '(*)'] + ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24201]:', 'Invalid', 'user', '(*)', 'from', '(*)']
    假设 C12 (combined压缩后) = 150 字节 (由于L1和L2很相似,组合后压缩效率更高)

  • 计算LCD(L1, L2):
    LCD(L1, L2) = max((150 - 100) / 100, (150 - 100) / 100) = 0.5

  • 计算L1, L3的组合和LCD:

    combined = ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24200]:', 'Invalid', 'user', '(*)', 'from', '(*)'] + ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[24202]:', 'Accepted', 'password', 'for', 'illegal', 'user', 'ken', 'from', '(*)']

    假设 C13 (combined压缩后) = 210 字节 (L1和L3差异较大,组合后压缩效率降低)

    LCD(L1, L3) = max((210 - 100) / 120, (210 - 120) / 100) = max(0.917, 0.9) = 0.917

3. 计算相似度得分:

  • 计算准确度得分 (假设阈值为0.8)

    • L1 和 L2:

      • a_score=9/10=0.9 (10个词中有9个相同,占位符也算匹配)
      • Dsim=1LCD(L1,L2)=10.5=0.5
    • L1 和 L3:

      • a_score=4/13=0.31 (13个词只有4个相同)
      • 由于 a_score<0.8, 所以直接计算 Dsim=1LCD(L1,L3)=10.917=0.083

4. 模板提取:

  • 聚类: 假设相似度阈值为0.4。

    • L1和L2的相似度得分0.5高于0.4,因此将L1和L2归为一类。
    • L1和L3的相似度得分0.083低于0.4,因此L3不与L1和L2归为一类。
  • 模板生成:

    • 对于L1和L2的聚类:

      通过比较L1和L2,找到相同部分和不同部分:

      • Dec 10 06:55:46 LabSZ sshd[(*)]: Invalid user (*) from (*)
    • 对于L3,由于它是单独一类,直接作为模板:

      • Dec 10 06:55:46 LabSZ sshd[(*)]: Accepted password for illegal user ken from (*)

结果:

  • 模板1: Dec 10 06:55:46 LabSZ sshd[(*)]: Invalid user (*) from (*) (对应日志L1和L2)
  • 模板2: Dec 10 06:55:46 LabSZ sshd[(*)]: Accepted password for illegal user ken from (*) (对应日志L3)

压缩字典示例:

假设Dec 10 06:55:46 LabSZ sshd[(*)]: Invalid user (*) from (*) 的MD5哈希值为 a1b2c3d4, 则压缩字典可能包含:

compression_dictionary = {
    "a1b2c3d4": {
        "words": ['Dec', '10', '06:55:46', 'LabSZ', 'sshd[(*)]:', 'Invalid', 'user', '(*)', 'from', '(*)'],
        "log_ids": [1, 2],
        "counts": 2,
        "compressed_length": 100  # 假设压缩长度为100字节
    }
}

总结:

这个例子简化了LogGzip的流程,但展示了其核心思想:通过Gzip压缩、计算压缩距离和相似度,将相似的日志消息聚类并提取模板。 实际应用中,还需要考虑更多细节,例如:动态调整阈值、处理更复杂的日志格式等。

借鉴于 LenMa 的方法

Lenma 聚类的阀值是使用余弦相似度来比较。而LogGzip是通过计算压缩距离之间的差别来完成。他们其他共同点都一样。总体流程如下:
先对日志进行正则-——》得到初步模版-——》计算与已经存在的模版的word相同数(其实这一步已经基本上可以分类成功)———》计算相似度或者压缩距离(基于上一步没找到模版的情况)——》更新模版(将这两个模版不一样的部分替换为*)——》聚类完成。

演示 LenMa 的整个聚类流程。

1. 初始状态:

  • 已存在的聚类集合 C 为空。
  • 阈值:Tc = 0.9, Tp = 3 (这个参数很重要,会直接影响聚类的结果,这里只是假设)

2. 接收第一条消息:

  • 消息:sshd[123]: Invalid user admin from 1.2.3.4
  • 步骤:
    • 创建向量:
      • V = [4, 3, 7, 4, 5, 4, 7] (sshd, [123], Invalid, user, admin, from, 1.2.3.4)
      • W = ["sshd", "[123]", "Invalid", "user", "admin", "from", "1.2.3.4"]
    • 查找最相似聚类: 因为 C 为空,没有已存在的聚类可以比较。
    • 创建新聚类: 创建一个新的聚类 c1,并将消息添加到 c1 中。
      • c1.Vc = [4, 3, 7, 4, 5, 4, 7]
      • c1.Wc = ["sshd", "[123]", "Invalid", "user", "admin", "from", "1.2.3.4"]
    • 更新状态:C =

3. 接收第二条消息:

  • 消息:sshd[456]: Invalid user root from 5.6.7.8
  • 步骤:
    • 创建向量:

      • V = [4, 3, 7, 4, 4, 4, 7] (sshd, [456], Invalid, user, root, from, 5.6.7.8)
      • W = ["sshd", "[456]", "Invalid", "user", "root", "from", "5.6.7.8"]
    • 查找最相似聚类: 计算 V 和 W 与 c1 的相似度

      • 余弦相似度 (Sc): Vc 和 V 的余弦相似度为:
        Sc = (4*4 + 3*3 + 7*7 + 4*4 + 5*4 + 4*4 + 7*7) / (sqrt(4^2+3^2+7^2+4^2+5^2+4^2+7^2) * sqrt(4^2+3^2+7^2+4^2+4^2+4^2+7^2))
        Sc ≈ 0.98
        
      • 位置相似度 (Sp): Wc 和 W 在相同位置上相同的单词数量为:
        {"sshd", "Invalid", "user", "from"}
        Sp = 4
        
      • 计算最终 Score:由于Sp = 4 > Tp = 3, 且 Sc = 0.98 > Tc = 0.9
    • 添加到已存在的聚类: 将新消息添加到 c1 中。

    • 更新聚类向量:

      • 更新 c1.Vc:
        c1.Vc = [4, 3, 7, 4, 5, 4, 7] (因为[4,3,7,4,5,4,7]和[4, 3, 7, 4, 4, 4, 7]不同,所以合并两个向量)
        //1. 位置0:4 == 4  ,c1.Vc[0] 不变
        //2. 位置1:3 == 3  ,c1.Vc[1] 不变
        //3. 位置2:7 == 7  ,c1.Vc[2] 不变
        //4. 位置3:4 == 4  ,c1.Vc[3] 不变
        //5. 位置4:5 != 4  ,c1.Vc[4] = 5 (这里使用了第一条信息的长度)
        //6. 位置5:4 == 4  ,c1.Vc[5] 不变
        //7. 位置6:7 == 7  ,c1.Vc[6] 不变
        //最终的结果是[4, 3, 7, 4, 5, 4, 7]
        
      • 更新 c1.Wc:
        c1.Wc = ["sshd", "[123]", "Invalid", "user", "admin", "from", "1.2.3.4"]
        //1. 位置0:"sshd" == "sshd" , c1.Wc[0] 不变
        //2. 位置1:"[123]" != "[456]",c1.Wc[1] = "*"
        //3. 位置2:"Invalid" == "Invalid", c1.Wc[2] 不变
        //4. 位置3:"user" == "user", c1.Wc[3] 不变
        //5. 位置4:"admin" != "root",c1.Wc[4] = "*"
        //6. 位置5:"from" == "from",c1.Wc[5] 不变
        //7. 位置6:"1.2.3.4" != "5.6.7.8",c1.Wc[6] = "*"
        
        //最终的结果 ["sshd", "*", "Invalid", "user", "*", "from", "*"]
        
    • 更新状态:C =

      • c1.Vc = [4, 3, 7, 4, 5, 4, 7]
      • c1.Wc = ["sshd", "*", "Invalid", "user", "*", "from", "*"]

4. 接收第三条消息:

  • 消息:postfix/smtpd[789]: connect from unknown[10.11.12.13]
  • 步骤:
    • 创建向量:

      • V = [7, 5, 7, 7, 7, 10] (postfix, smtpd, connect, from, unknown, 10.11.12.13)
      • W = ["postfix/smtpd", "[789]", "connect", "from", "unknown", "[10.11.12.13]"]
    • 查找最相似聚类: 计算 V 和 W 与 c1 的相似度

      • Vc 和 V 的长度不一样,因此 SIMILARITY 函数直接返回 0
    • 由于没有超过阈值,因此创建新的聚类 c2

    • 更新状态:C =

在这个例子中,最终会形成两个聚类:

  • c1: 包含与 sshd 认证失败相关的消息,模板为 sshd * Invalid user * from *
  • c2: 包含与 postfix 相关的消息,模板为 postfix/smtpd * connect from unknown [*]

总结:

这个例子演示了 LenMa 的基本流程。LenMa 算法的关键在于计算相似度,以及如何根据新消息更新聚类的向量。同时,阈值的选择会直接影响聚类的结果,需要根据实际情况进行调整。

LogGzip 的局限性:

论文中提到的局限性:

  1. 特定数据格式处理失败(Failure to handle certain data formats):

    • 问题描述: LogGzip 在某些情况下无法正确地将变量替换为通配符"(*)"。例如,对于日志消息 workerEnv.init() ok /etc/httpd/conf/workers2.properties,LogGzip 无法将其解析为 workerEnv.init() ok (*),而是直接保留原始文本。
    • 原因分析: 这是因为 /etc/httpd/conf/workers2.properties 在所有样本中都保持一致,导致 LogGzip 无法将其识别为变量。
    • 影响: 降低了对新模式的泛化能力,因为未正确识别变量会导致相似的日志被错误地分类。
  2. 过度泛化(Over-generalization):

    • 问题描述: LogGzip 有时会将不同的固定文本元素错误地识别为变量,导致过度泛化。例如,cupsd shutdown succeededcupsd startup succeeded 这两个消息都被解析为 cupsd (*) succeeded
    • 原因分析: 这是因为训练数据中 shutdownstartup 的实例数量较少,导致 LogGzip 误认为它们是可以变化的。
    • 影响: 导致日志模板的含义模糊,降低了日志分析的准确性。

未在论文中明确提及,但可以推断的局限性:

  1. 对相似度阈值(Similarity Threshold)的敏感性:

    • 问题描述: LogGzip 的性能受到相似度阈值的影响。阈值过高可能导致过度细分,相似的日志被分为不同的类别;阈值过低可能导致过度泛化,不同的日志被合并到同一类别。
    • 原因分析: 合适的阈值取决于数据集的特性和日志格式。选择一个通用的最优阈值可能比较困难。
    • 影响: 需要根据具体应用场景调整阈值,增加了使用的复杂性。
  2. 计算复杂度(Computational Complexity):

    • 问题描述: LogGzip 需要对日志消息进行多次压缩操作,计算复杂度较高,尤其是在处理大规模日志数据时。
    • 原因分析: 每次计算压缩距离都需要进行多次 Gzip 压缩,这是一种计算密集型操作。
    • 影响: 降低了日志解析的效率,可能不适用于对实时性要求较高的场景。
  3. 对日志数据分布的依赖性(Dependence on Log Data Distribution):

    • 问题描述: LogGzip 的性能受到训练数据分布的影响。如果某些类型的日志消息在训练数据中出现频率较低,则 LogGzip 可能无法正确地识别它们,导致解析准确性下降。
    • 原因分析: LogGzip 依赖于压缩算法来识别重复模式,如果某些模式的出现频率较低,则压缩算法可能无法有效地捕捉到它们。
    • 影响: 在数据分布不均衡的情况下,LogGzip 的性能可能受到影响。
  4. 对于非文本类日志的适应性 (Adaptability to non-text logs)

    • 问题描述:LogGzip 主要是为文本日志设计的,对于图像、音频或者其他非文本的日志,其有效性会大大降低。
    • 原因分析:因为gzip 本身是用于文本压缩的,无法对这些非文本日志进行有效压缩,导致后续计算出的相似度出现偏差。
    • 影响:导致算法不能适用于一些更为通用的日志分析场景。

总结:

LogGzip 是一种有效的日志解析方法,但在实际应用中需要注意上述局限性。为了提高 LogGzip 的性能,可以考虑以下改进方向:

  • 优化变量识别算法: 改进变量识别算法,使其能够更准确地识别不同类型的变量,并减少过度泛化的发生。
  • 动态调整相似度阈值: 开发一种能够自动调整相似度阈值的算法,以适应不同的数据集和日志格式。
  • 优化压缩过程: 探索更高效的压缩算法,或者通过并行计算来加速压缩过程。
  • 处理数据分布不均衡问题: 采用过采样或欠采样等技术来平衡训练数据的分布,提高 LogGzip 对罕见日志消息的识别能力。

通过解决这些局限性,可以进一步提高 LogGzip 的性能和鲁棒性,使其在更广泛的应用场景中发挥作用。

posted @   云岛夜川川  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示