文章目录
- 1.寻找领域内文章和代码
- 1.1http://t.csdnimg.cn/nTFUk:主要内容总结:
- 1.2系统日志分析用于异常检测pca
- 1.3csdn介绍未来方向
- 1.4小米
- 1.5 Log Anomaly
- 1.6[AIOps-日志异常检测概述与应用挑战 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/529506738)
- 1.7[从 2023 CCF AIOps 挑战赛看日志异常检测 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/676238710)
- 1.8[GitHub - NetManAIOps/Log2Vec:在线日志的分布式表示方法。](https://github.com/NetManAIOps/Log2Vec)
- 1.9[面向跨语言的操作系统日志异常检测技术研究与实现-51CTO.COM](https://www.51cto.com/article/714875.html)
- 2.已有的代码
- 3.中文关于日志异常检测的实现
- 4.我能从它们的实现中运用到自己的地方
- 5.bilbil学术论坛:基于深度学习的日志异常检测
1.寻找领域内文章和代码
- csdn和知乎
- 代码relax网站
- paper with code
- 知网
- …
3/27/2024/15:37
1.1http://t.csdnimg.cn/nTFUk:主要内容总结:
1.1.1该领域面临许多挑战
1.1.1.1数据表示方面
深度学习模型接受结构化的数字形式输入。(日志是半结构化的,需要进行日志解析处理来提取序列等特征,且是数字形式,模板id是数字,其它属性能用数字表示吗)
**第一个问题:**背景:我的研究领域是异常检测,业界有机器学习算法和深度学习算法来做相关的工作。 描述:日志异常检测面临的挑战之一是数据表示:深度学习模型接受结构化的数字形式的输入。通常大家的做法是采用日志解析算法例如Drain、spell等来将半结构化日志转换为结构化日志,然后使用模板id来作为深度学习模型结构化的数字形式的输入 问题1:**你知道日志还有其他属性能作为深度学习模型结构化的数字形式的输入吗?请列出 问题2:或者是有其他的数据表示形式来将日志输入深度学习模型?**是什么
**第一个回答:**针对问题1和问题2,以下是一些可能用作深度学习模型输入的日志属性或数据表示形式:
问题1:
- 时间戳:日志中的时间信息可以作为一个重要的属性,可以帮助模型捕捉事件之间的时间相关性。
- 日志级别:日志的级别(如INFO、DEBUG、ERROR等)可以提供关于事件重要性和严重性的信息。
- 日志消息内容:日志消息本身可能包含有用的信息,例如异常的具体描述或操作细节。
- 上下文信息:与日志事件相关的上下文信息,如用户ID、设备ID、IP地址等,可能对异常检测有所帮助。
- 异常标记:如果日志已经被标记为异常或正常,这个标记可以直接作为模型的目标标签。
问题2:
除了上述提到的结构化的数字形式,还可以考虑以下其他的数据表示形式:
- 文本表示:将日志消息内容转换为词向量或句向量,可以使用诸如Word2Vec、BERT等预训练的文本嵌入模型来捕捉语义信息。
- 序列表示:将日志按照时间顺序形成序列,然后使用循环神经网络(RNN)或者Transformer等模型来处理序列信息。
图形表示:将日志事件之间的关系表示为图结构,其中节点表示事件,边表示事件之间的关系,然后可以使用图神经网络进行处理。- 多模态表示:结合日志消息内容、时间戳、日志级别等多种属性,构建多模态数据表示,以提供更全面的信息给深度学习模型。
综上所述,日志异常检测可以利用多种属性和数据表示形式来构建深度学习模型的输入,具体选择应根据具体问题和数据特征进行决定。
**第二个问题:**在用作深度学习模型输入的日志属性中,你给出的五个:时间戳、日志级别、日志消息内容、上下文信息、异常标记;它们怎么作为深度学习模型所接受的结构化的数字形式的输入?请注意是数字形式的输入,比如时间戳怎么成为数字形式的?日志级别怎么成为数字形式的?
第二个回答:对于将日志属性转换为深度学习模型接受的结构化数字形式的输入,可以采取以下方法:
-
时间戳:时间戳通常是以日期时间的形式表示,可以将其转换为数字形式,比如Unix时间戳(即从1970年1月1日至今的秒数)。这样,每个时间戳都可以表示为一个数字,以便深度学习模型理解。
-
日志级别:日志级别通常是一组预定义的分类,例如INFO、DEBUG、ERROR等。可以将每个级别映射到一个数字,例如INFO为0,DEBUG为1,ERROR为2等等。这样,每个日志级别都可以表示为一个数字。
-
日志消息内容:日志消息内容通常是文本形式,可以使用自然语言处理技术将其转换为数字形式。一种常见的方法是使用词袋模型或词嵌入技术,将每个单词映射到一个向量表示。然后可以将整个消息的向量表示为单词向量的平均值或使用词嵌入模型如Word2Vec、BERT等来获取整个句子的向量表示。
-
上下文信息:上下文信息可以是各种属性,如用户ID、设备ID、IP地址等。这些信息通常已经是数字形式的,但如果不是数字形式,也可以将它们编码为数字,例如使用哈希函数或者独热编码。
-
异常标记:异常标记通常是二元的,表示日志事件是否异常。可以将异常标记映射为0或1,其中0表示正常,1表示异常。
综上所述,通过将日志属性转换为数字形式,我们可以将其作为深度学习模型所接受的结构化输入。这样,每个日志事件就可以表示为一个数字向量,其中包含了时间戳、日志级别、消息内容、上下文信息和异常标记等属性。
1.1.1.2数据不稳定
通俗理解就是出现不在训练数据中的新日志事件类型(肯定是会出现新类型,这种情况下业界怎么做的?)
**问题:**数据不稳定:随着应用程序的发展,可能会出现不在训练数据中的新日志事件类型。业界怎么应对这种数据不稳定性?
**回答:**处理数据不稳定性是一个重要而挑战性的问题,特别是在异常检测等领域,其中新的日志事件类型可能会频繁出现。以下是业界常见的一些方法来应对数据不稳定性:
-
持续监控和更新模型:保持对系统的持续监控,及时发现新的日志事件类型。当发现新的日志事件类型时,及时更新模型以适应这些变化,这可以是周期性的更新或者是实时更新,取决于业务需求和数据变化的速度。
-
半监督学习:利用半监督学习方法,即使用标记数据和未标记数据进行训练。对于未标记的新数据,可以通过模型自动标记来进行监督学习,从而帮助模型适应新的日志事件类型。
-
增量学习:使用增量学习技术,允许模型在学习过程中不断地接收新数据并更新自身,而无需重新训练整个模型。这可以节省时间和资源,并且可以更快地适应数据的变化。
-
特征选择和自适应特征提取:针对数据的不稳定性,可以使用自适应特征选择或提取方法,动态地选择最具代表性的特征或提取最相关的特征来进行建模,从而提高模型的泛化能力和适应性。
-
异常检测的元学习:元学习是一种让模型学习如何学习的技术。通过元学习,模型可以快速适应新的日志事件类型,并在未经训练的情况下进行有效的异常检测。
-
数据合成和数据增强:使用数据合成或数据增强技术来生成类似于新日志事件类型的合成数据,以扩充训练集并提高模型的泛化能力。这些技术可以利用现有数据生成更多的样本,以覆盖潜在的新日志事件类型。
综上所述,业界可以采用多种方法来应对数据不稳定性,包括持续监控和更新模型、半监督学习、增量学习、特征选择和自适应特征提取、异常检测的元学习以及数据合成和数据增强等技术。选择哪种方法取决于数据的变化速度、业务需求以及可用的资源等因素。
1.1.1.3数据不平衡
正常>异常(只学习正常数据可行吗)
**问题:**日志数据不平衡挑战:异常数据的数量远少于正常数据。 问题1:别人都怎么做? 问题2:只学习正常数据可行吗
**回答:**面对日志数据不平衡的挑战,业界通常采取以下方法:
问题1:
-
过采样(Oversampling)和欠采样(Undersampling):过采样通过增加异常数据样本的复制或生成新的合成数据来平衡类别分布,而欠采样则通过删除正常数据样本来达到平衡。这些方法可能会带来一些问题,如过采样可能导致过拟合,而欠采样可能导致信息丢失,但它们仍然是常见的解决方案。
-
基于代价的方法(Cost-sensitive methods):通过调整损失函数来考虑不同类别的代价,使模型更加关注少数类别。例如,可以为异常类别分配更高的误分类成本,以促使模型更好地识别异常。
-
集成学习(Ensemble Learning):通过结合多个基分类器的预测结果,可以提高模型的泛化性能。可以使用各种集成方法,如Bagging、Boosting等,以平衡类别分布并提高模型的整体性能。
-
生成对抗网络(Generative Adversarial Networks,GANs):使用生成对抗网络生成合成的异常数据样本,以增加异常数据的数量,从而平衡数据集。这种方法可以更好地保留异常数据的特征,避免了简单的过采样或欠采样可能带来的问题。
问题2:
只学习正常数据可能并不可行,因为这会导致模型在面对异常数据时无法正确识别。尽管正常数据可能是主要的,但异常数据对于异常检测任务至关重要。如果只学习正常数据,模型可能会对异常数据产生误判,无法实现有效的异常检测。因此,通常需要确保模型在训练过程中同时学习正常和异常数据,以获得更好的泛化能力和检测性能。
综上所述,面对日志数据不平衡的挑战,业界通常采取过采样和欠采样、基于代价的方法、集成学习、生成对抗网络等方法来平衡数据集。同时,为了实现有效的异常检测,通常需要确保模型在训练过程中同时学习正常和异常数据。
1.1.1.4异常多样性
异常日志表现内容多样,如序列模式,频率,相关性,到达时间等(还有其他的吗)
**问题:**面临的挑战之异常日志表现内容多样,如序列模式,频率,相关性,到达时间等 问题一:解释一下序列模型异常、频率异常、相关性异常、到达时间异常 问题二:还有其他的表现内容吗
**回答:**问题一:
-
序列模型异常:序列模型异常指的是日志事件之间的序列模式与正常情况下的预期序列模式不符。这可能表现为一系列日志事件的出现顺序或时间间隔与正常操作不符,例如在正常情况下某个特定序列模式几乎不会发生但突然出现了,或者某个序列模式的出现频率与预期不符合。
-
频率异常:频率异常指的是特定类型的日志事件发生的频率异常高或异常低。这可能表现为某些日志事件的出现次数远远超过了正常情况下的预期值,或者某些日志事件的出现次数明显少于预期值。
-
相关性异常:相关性异常指的是日志事件之间的关联性与正常情况下的预期关联性不符。这可能表现为某些日志事件之间的关联性出现了意外的变化,例如正常情况下两个事件之间通常同时发生但现在只发生了其中一个。
-
到达时间异常:到达时间异常指的是日志事件的到达时间与正常情况下的预期到达时间不符。这可能表现为某些日志事件的到达时间出现了明显的偏差,例如在正常情况下某些事件通常在特定时间发生但现在在其他时间发生了。
问题二:
除了序列模型异常、频率异常、相关性异常、到达时间异常外,还可能有其他的异常表现内容,例如:
-
异常模式异常:即使日志事件按照正常的序列出现,但是其模式或属性与已知的正常模式或属性不匹配,这也可能被视为异常。
-
空值或异常值:某些日志事件的属性值为空或者超出了预期的取值范围,可能表明数据损坏或错误。
-
长尾分布异常:某些异常事件可能遵循长尾分布,即出现频率较低但对系统影响较大的异常,这种异常可能不容易被传统方法检测到。
-
异常趋势:正常情况下日志事件的趋势可能是稳定的,但出现了某种不寻常的变化或波动,可能表明系统出现了异常情况。
综上所述,除了序列模型异常、频率异常、相关性异常、到达时间异常外,还可能存在其他类型的异常表现内容,例如异常模式异常、空值或异常值、长尾分布异常、异常趋势等。在进行异常检测时,需要考虑到这些不同的异常表现形式,以提高异常检测的效果和覆盖范围。
1.1.1.5标签稀少
带标注的日志是稀缺的,无监督可行吗如何去定义相关性聚类?
**问题:**面临的挑战之标签可用性:带标注的日志是稀缺的。 问题一:业界用深度学习写论文都是用有标签的去训练吗 问题二:无监督可行吗有哪些困难 问题三:聚类这种无监督算法,如何去定义相关性?
**答案:**问题一:
在深度学习研究领域,使用有标签的数据进行训练确实是常见的做法,因为标签数据可以为模型提供明确的目标,有助于模型学习正确的特征和进行有效的预测。然而,并不是所有的深度学习研究都需要有标签的数据。有时候,研究人员也会尝试使用无监督或半监督学习方法,或者利用迁移学习等技术来克服标签稀缺性的问题。
问题二:
无监督学习在处理标签稀缺性问题上是可行的,但也面临一些困难。其中的一个主要困难是缺乏明确的目标标签,因此模型必须在没有显式标签的情况下进行学习。这可能导致模型的性能不稳定,因为没有明确的目标来指导模型的学习过程。此外,无监督学习算法通常需要更多的数据来获得良好的泛化性能,因为它们必须从数据中自动学习特征和模式。
问题三:
在使用聚类作为无监督算法时,定义相关性是一个关键问题。通常,相关性可以通过两个数据点之间的距离或相似性来定义。常见的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等。在聚类算法中,通常会根据这些距离或相似性度量来将数据点分组成不同的簇,其中簇内的数据点之间的距离或相似性较小,而簇间的数据点之间的距离或相似性较大。因此,在定义相关性时,需要选择适当的距离度量,并根据具体的应用场景和数据特征来确定。
1.1.1.6流处理
怎么区分是不是流处理(即实时检测)和事后分析?
**问题:**面临的挑战之流处理:日志是数据流,实时检测比事后分析更符合实际需求。 问题一:怎么区分是不是流处理(即实时检测)和事后分析? 问题二:如何将不是流处理的转换为实时检测?
**回答:**问题一:区分流处理和事后分析的关键在于数据处理的时机和目的。具体而言:
-
流处理(实时检测):流处理是指在数据产生后立即对数据进行处理和分析,通常在数据到达之后的短时间内就进行处理。在日志分析中,流处理意味着对实时生成的日志数据进行即时的异常检测和分析,以便快速发现和响应异常事件。
-
事后分析:事后分析则是指对数据在产生后一段时间内进行收集、存储,然后在之后的某个时间点对数据进行分析和处理。在日志分析中,事后分析可能涉及对一段时间内的日志数据进行离线处理,以查找历史上的异常模式或行为。
问题二:将非流处理转换为实时检测需要采取以下步骤:
-
数据流化:将原始数据转换为可流式处理的数据流。这可能涉及到实时数据采集和传输技术,确保数据以流的形式被持续地发送到处理系统。
-
实时处理架构:建立实时处理架构,包括流处理引擎、消息队列、实时计算框架等组件,用于处理和分析数据流。常见的实时处理框架包括Apache Kafka、Apache Flink、Apache Spark Streaming等。
-
实时特征提取:针对异常检测任务,设计和实现实时特征提取模块,从数据流中提取和计算需要的特征。这可能包括计数、频率、时间窗口等特征。
-
实时模型训练与更新:建立实时模型训练和更新机制,确保模型能够及时地适应新的数据和变化。可以采用在线学习或增量学习的方法,实时更新模型参数。
-
实时异常检测与响应:实现实时异常检测算法,并结合实时处理架构和模型进行异常检测和响应。当检测到异常时,可以立即触发警报、通知相关人员或者执行自动化的响应操作。
通过以上步骤,可以将原本的非流处理转换为实时检测,从而满足实时性要求。这样可以更快地发现和处理异常,减少潜在的损失和风险。
1.1.1.7数据量大
对算法效率提出了要求。(怎么高效检测日志)
**问题:**数据量大:日志数据的生成量很大,一些系统每天产生数百万甚至数十亿的事件,这对算法的效率有要求。 问题:高效检测日志你有没有好的方法或建议?
**回答:**针对处理大规模日志数据的高效检测,以下是一些方法和建议:
-
分布式处理:采用分布式处理技术来处理大规模日志数据,可以通过将数据分割成多个部分并在多台计算机上并行处理来提高效率。常见的分布式处理框架包括Apache Hadoop、Apache Spark等。
-
流式处理:使用流式处理技术来实时处理和分析日志数据流,以便快速检测异常并做出及时响应。流式处理技术可以确保数据在生成后立即被处理,而不需要等待所有数据被收集完毕。
-
近似算法:对于大规模数据,可以考虑使用近似算法来加快处理速度。这些算法能够以牺牲一定的准确性为代价,提高处理速度。例如,Bloom Filter 可用于快速过滤出不太可能是异常的事件。
-
数据压缩和存储优化:在处理和存储大规模日志数据时,可以采用数据压缩和存储优化技术来减少数据存储和传输的开销。这包括使用压缩算法、列式存储、分区存储等技术来减小数据体积。
-
特征选择和降维:在进行日志异常检测时,选择最具代表性和重要性的特征,并使用降维技术(如主成分分析、奇异值分解等)来减少特征空间的维度,以提高算法的效率和性能。
-
并行计算和异步处理:利用多线程、多进程或者分布式任务队列等技术实现并行计算和异步处理,以提高处理效率和吞吐量。
-
硬件优化:对于需要大量计算资源的算法,可以考虑使用专门的硬件加速器(如GPU、TPU等)来提高计算速度。
综上所述,处理大规模日志数据的高效检测可以通过采用分布式处理、流式处理、近似算法、数据压缩和存储优化、特征选择和降维、并行计算和异步处理、以及硬件优化等方法来实现。选择合适的方法取决于具体的业务需求、数据特征和可用资源等因素。
1.1.1.8模型可解释性
基于神经网络的方法通常比传统的机器学习方法具有更低的可解释性,这个可解释性如何通俗的理解
基于神经网络的方法通常比传统的机器学习方法具有较低的可解释性,这是因为神经网络是一种黑盒模型,其内部结构和参数之间的关系很难被直观地理解。传统的机器学习方法,如决策树和逻辑回归,通常可以提供更直接的解释和理解。
可解释性可以通俗地理解为我们能够理解模型的决策过程和结果产生的原因。在神经网络中,模型通过大量的神经元和复杂的连接方式来学习输入和输出之间的映射关系,这使得模型的决策过程变得复杂且难以解释。相比之下,传统的机器学习方法通常使用更简单的模型结构,例如决策树可以通过一系列简单的规则来解释决策过程。
虽然神经网络的可解释性较低,但它在处理复杂任务和大规模数据上具有优势。神经网络可以自动从数据中学习特征表示,并且在许多领域中取得了令人瞩目的成果。对于一些应用场景而言,模型的准确性和性能可能更重要,而可解释性则可以通过其他手段来解释和验证。
可解释性则可以通过其他手段来解释和验证。能讲讲有哪些手段吗
当涉及到解释和验证可解释性时,可以采用以下几种手段:
特征重要性分析:通过分析模型中各个特征对结果的影响程度,可以了解到哪些特征对于模型的预测起到了重要作用。常用的方法包括信息增益、基尼系数、L1正则化等。
局部可解释性方法:这些方法试图解释模型在某个具体样本上的预测结果。例如,局部可解释性方法可以通过计算每个特征对于某个样本的贡献度来解释模型的预测结果。
可视化方法:通过可视化模型的决策过程或者特征之间的关系,可以更直观地理解模型的预测原理。例如,决策树模型可以通过可视化树结构来解释每个节点的判断依据。
规则提取:有些模型可以生成一系列规则来解释其预测结果。例如,关联规则挖掘可以从数据中提取出频繁项集和关联规则,从而解释数据中的关联关系。
可解释性指标:除了具体的解释方法外,还可以使用一些可解释性指标来评估模型的可解释性。例如,模型的复杂度、解释的准确性、解释的一致性等指标可以用来评估模型的可解释性。
当涉及到针对关键系统行为或安全事件做出合理决策时,理解正确和错误分类背后的原因尤其困难。(为什么某日志分类为正确(错误)的呢?原因是什么?深度学习的缺陷吗)(神经网络是一种黑盒模型,其内部结构和参数之间的关系很难被直观地理解。传统的机器学习方法,如决策树和逻辑回归,通常可以提供更直接的解释和理解)(可解释性就是我们能够理解模型的决策过程和结果产生的原因)
**问题:**面临挑战之模型可解释性:基于神经网络的方法通常比传统的机器学习方法具有更低的可解释性。当涉及到针对关键系统行为或安全事件做出合理决策时,理解正确和错误分类背后的原因尤其困难。 问题一:如何抉择机器学习和深度学习算法?
**回答:**在选择机器学习和深度学习算法时,需要考虑以下因素:
-
数据特征:深度学习算法通常在大规模数据和高维特征空间中表现良好,尤其是对于非线性关系的建模。如果数据具有复杂的结构或非线性关系,并且数据量足够大,则深度学习算法可能是一个不错的选择。而如果数据量较小或特征维度较低,传统的机器学习算法可能更合适。
-
任务复杂度:深度学习算法通常在处理复杂任务(如图像识别、自然语言处理等)时效果较好,但在处理简单任务时可能过于复杂而不切实际。对于简单的任务或者对模型可解释性要求较高的场景,传统的机器学习算法可能更适合。
-
可解释性需求:如果模型的可解释性对于任务至关重要,例如在医疗诊断、金融风控等领域,需要能够清晰地理解模型的决策过程,则传统的机器学习算法(如决策树、逻辑回归等)通常更合适。而深度学习算法由于其复杂的结构和黑盒性质,可能会导致解释困难。
-
数据量和计算资源:深度学习算法通常需要大量的数据和计算资源来进行训练,并且可能需要更长的训练时间。如果数据量有限或者计算资源受限,则传统的机器学习算法可能更加适用。
-
模型效果:最终选择的算法应该是在给定任务上表现最好的算法。可以通过交叉验证、实验测试等方法来评估不同算法的效果,并选择效果最佳的算法。
综上所述,选择机器学习和深度学习算法时需要考虑数据特征、任务复杂度、可解释性需求、数据量和计算资源以及模型效果等因素,并根据具体情况权衡利弊进行抉择。
1.1.1.9规范不统一
1.1.2深度学习实现
1.1.2.1预处理和特征提取
预处理方式有两种:1是Drain2是基于token将日志拆分为单词列表,如通过空格拆分。再删除特殊字符,如数字等。
固定窗口、时间窗口、会话窗口(特殊日志)
特征表示有三种:语义向量
语义向量:在自然语言处理领域,通常的做法是将句子中的单词转换为语义向量,这些语义向量对基于上下文的语义(例如Word2Vec、BERT)或语言统计(例如TF-IDF)进行编码。语义编码通常通过在特定日志文件上训练深度神经网络或通过预训练模型来实现。
位置编码:语义向量有时与位置嵌入结合使用基于它们在序列中的相对位置进行编码。为了将位置信息添加到编码的日志消息中,通常分别为偶数和奇数令牌索引使用正弦和余弦函数。
独热编码
嵌入层/矩阵:通常用于解决高维输入数据稀疏性问题。它们通常是随机初始化的参数,与分类模型一起训练,以创建日志消息的最佳向量编码。向量编码通常排列在矩阵中,使得通过将矩阵与一个热编码的日志向量相乘来获得特定日志模板的相应向量。与语义向量的主要区别在于,嵌入层/矩阵通常不针对NLP目标进行训练,即它们不旨在学习像Word2Vec这样的词的语义;相反,仅训练嵌入层/矩阵以最小化分类网络的损失函数。还使用基于深度学习的自定义嵌入模型;我们将其输出称为深度编码嵌入(DE)。这包括基于字符、事件和序列的嵌入[42]、使用MLP和CNN的注意机制[45]以及将标签信息输入VAE[1]的令牌计数。
自定义嵌入模型
基于深度学习的自定义嵌入模型包括基于字符、事件和序列的嵌入、使用MLP和CNN的注意机制等。
1.1.2.2异常检测
**异常类型:**离群值,顺序异常,频率异常,统计异常
1.1.2.3算法评估
HDFS,Hadoop,Openstack,BGL,Thunderbird 和Sprit,gaia
1.1.2.4总结
日志异常检测的主要挑战 :未知日志的出现是算法要解决的主要问题之一,解决这一问题的关键思想是将日志表示为语义向量,将其与已知日志进行比较。(为什么?它允许算法理解日志的含义和语境,而不仅仅是简单地将其视为一组文本字符。通过将语义信息编码为向量,算法可以更好地捕捉日志消息之间的相似性和差异性,从而更有效地检测异常。)
rnn是最广泛的模型,CNN 为 RNN 的有效替代方案,因为它们还能够提取事件相关性。
1.2系统日志分析用于异常检测pca
总体框架
收集解析特提检测
解析反解析:解析后的模板+参数不就是原始日志
特征提取:编码成数字特征向量;窗口划分后,每个日志序列生成一个特征向量(事件计数向量),表示每个事件发生的次数。所有特征向量在一起形成特征矩阵,即事件计数矩阵。
1.3csdn介绍未来方向
-
自建语料库、和原本语料库结合
-
日志数据不平衡问题、标签少
-
对新日志、未出现过的异常的泛化能力较差(不同域)
-
深度学习模型训练时间长
-
无监督准确率低
1.4小米
1.5 Log Anomaly
1.6AIOps-日志异常检测概述与应用挑战 - 知乎 (zhihu.com)
1.6.1基于深度学习的方法:
-
主要有两种应用方式:
-
- 特征表示步骤:采用一些NLP的方法提取日志的语义向量
- 异常检测步骤:采用LSTM, attention等模型来代替传统的异常检测模型
-
日志异常模式:
-
- 模板关键字。
- 模板格式不同
- 模板顺序异常。模板数量:增加或减少。(或模板类型不符合正常类型)
- 连续型变量数值异常:某些日志变量是一些关键的指标值比如响应时间,其实可以把这类变量单独抽取出来作为一个指标进行监控
- 离散型变量分布异常:某些日志变量是离散型,这类变量可能存在分布型的异常,比如404返回码的占比突增表示访问可能出现了问题
- 时间间隔异常:单位时间内的日志数量
-
DeepLog针对模板顺序和变量数值的异常,LogAnomaly针对模板顺序和模板数量的异常。
-
总结:日志异常之间存在交集,eg:日志时间间隔异常通常也会有模板数量的异常,但是为了日志异常检测的物理意义,从不同异常模式来考虑是有实际意义的。
1.7从 2023 CCF AIOps 挑战赛看日志异常检测 - 知乎 (zhihu.com)
日志相关的 AIOps 任务主要分为日志异常检测、日志故障预测和日志故障诊断
日志异常检测主要帮助运维人员预防故障或者缩小故障的调查范围
- 由于日志数据量较大,在进行异常分析前往往提取相似日志,去除相似日志中不相同的变量部分,生成日志模板(LogPattern)或日志事件(LogEvent)。在日志事件级别进行分析
- 按照某种方式对日志进行分组,往往将时间上连续出现的日志分在一组,构造日志序列(LogSequence)。一般使用固定窗口、滑动窗口或者会话窗口的形式进行日志分组
- 对日志序列进行向量化表示,如考虑日志事件顺序的 SequenceVector,考虑日志事件数量的 QuantitativeVector,和考虑日志事件语义的 SemanticVector
- 使用传统机器学习模型或者深度学习模型在日志序列的向量化表示上进行预测任务训练(无监督)或者分类任务训练(有监督)
1数据泄露2数据不平衡评价指标失效3噪声敏感度高
1.8GitHub - NetManAIOps/Log2Vec:在线日志的分布式表示方法。
日志的级别:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
1.9面向跨语言的操作系统日志异常检测技术研究与实现-51CTO.COM
再续面向跨语言的操作系统日志异常检测技术研究与实现-51CTO.COM
基于日志分析的异常检测系统的设计与实现 - 百度文库 (baidu.com)
2.已有的代码
2.1日志解析
2.2机器学习代码
- 调试决策树,熟悉流程
dataloader.load_HDFS:
struct_log,
label_file=label_file,
window=‘session’, #会话窗口
train_ratio=0.5,#1:1训练测试
split_type=‘uniform’,#采用均匀分割方式,确保正样本和负样本在训练集和测试集中的分布是均匀的(默认sequential,顺序划分)
save_csv=True)#加载HDFS数据集
window_size没用到
Python endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False
块标识符(block_id)和事件标识符号(E3),并将它们整理成一个DataFrame,其中每行包含一个块标识符和与之关联的事件序列。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
**engine:**pandas解析数据时用的引擎,na_filter(丢失值检查)=False不过滤缺失值,memory_map=True尝试将文件映射到内存中以加快读取速度。
.iterrows():返回所有的行索引,以及该行的所有内容
# 使用正则表达式提取块标识符
blkId_list = re.findall(r'(blk_-?\d+)', row['Content'])
set_index()设置为索引
to_dict()转为字典
.apply()
_split_data中参数x_data是序列,y_data是标签。
np.hstack()拼接
Counter():可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
2.3深度学习但是数据不好处理(暂停了)
2.4deeplog
In prediction mode when logkeys are arranged/exposed against each source (here pods) as below:When we loop over each pod starting window anomalies are ignored (highlighted for two pods), here window size=5, how to capture those?
#48,#46,#41(分组也是转行),#35(日志转行),#36获取概率,#14(独热编码),#13(日志转行),#8
2.5deeplog
吴亦凡用的现成的用block_id划分组。
nailo2c自己固定分组不过是spell.
总结:drain解析的eventid是哈希形式,需要给转换成E1,E2的形式(nailo2c可用preprocessdrain.py)。机器学习代码数据处理成block_id+序列代码可里利用,计数矩阵代码。deeplog有三个实现,吴亦凡用的现成的用block_id划分组,nailo2c自己固定窗口不过是spell(我已经改了)它是1min中的固定窗口,logdeep还要在看一下。
loganomaly无监督
#12我不认为 lstm.py 可以直接用于运行 LogAnomaly。这是因为 lstm.py 只支持两种类型的输入,即“顺序”和“语义”。但是,LogAnomaly 使用“语义”和“定量”(即序列中每个事件模板的计数)。相比之下,DeepLog 使用“顺序”作为输入,因此只需使用 lstm.py 即可实现。
2.6logdeep
序列化BGL数据:滑动时间窗口可用
- gaia处理成序列或计数向量?
- drain解析的eventid是哈希形式,需要给转换成E1,E2的形式。怎么实现?naillo2c可能有用
- 会话窗口实现?机器学习中有blg的处理好像可能有用。logdeep也可能有用
- logdeep如何做的?
2.7总结已有代码
- loglizer会话窗口划分hdfs,
debug:DecisionTree_demo.py
dataloader.py中:elif log_file.endswith(‘.csv’),得到blk_-1608999687919862906,E4,E5,E6,E7,E8,E5,E2,E3。后得出BlockId,EventSequence,Label,blk_7063315473424667801,“[‘E5’, ‘E5’, ‘E5’, ‘E22’, ‘E11’, ‘E9’, ‘E11’, ‘E9’, ‘E26’, ‘E26’, ‘E11’, ‘E9’, ‘E26’, ‘E2’]”,0(处理划分数据有滑动窗口),经过 _split_data处理得到划分的(x_train, y_train), (x_test, y_test)
preprocessing.FeatureExtractor():拟合和转换训练数据
-
deeplog吴亦凡:visual.py可以展示数据的代码
-
nailo2c固定窗口划分:preprocessdrain.py的deeplog_df_transfer:分钟聚合数据
总结:drain解析的eventid是哈希形式,需要给转换成E1,E2的形式(nailo2c可用preprocessdrain.py)。
与机器学习代码数据处理成block_id+序列代码可里利用,计数矩阵代码。(似乎nailo2c也能来preprocessdrain.py)
deeplog有三个实现,吴亦凡用的现成的用block_id划分组,nailo2c自己固定窗口不过是spell(我已经改了)它是1min中的固定窗口
- logdeep还要在看一下:与1中的滑动窗口区别,后面调试运行代码:
先由log和templates组合进行输入structure_bgl.py得到
label,time,event_id -,2005-06-03-15.42.50.363779,E189
再由sample_bgl.py得到
sequence,label "['E189', 'E189',...],0
sample_hdfs.py
BlockId,EventSequence blk_-40115644493265216,"['E5', 'E5', 'E22', 'E5', 'E11', 'E11', 'E9', 'E9', 'E11', 'E9', 'E26', 'E26', 'E26', 'E2', 'E2', 'E2']" blk_-40115644493265216,"['E5', 'E5', 'E22', 'E5', 'E11', 'E11', 'E9', 'E9', 'E11', 'E9', 'E26', 'E26', 'E26', 'E2', 'E2', 'E2']"
- swisslog运行调试?
3.中文关于日志异常检测的实现
桌面上
4.我能从它们的实现中运用到自己的地方
5.bilbil学术论坛:基于深度学习的日志异常检测
日志格式,特点,正负样本不均衡,规范不统一,半结构化包含参数。
传统方法:基于统计特征,基于关键词,基于聚类方法。
监督半监督无监督。translog:编码器加解码器分类。编码器:顺序信息,注意力,残差,正则模块。从20min开始看
A2log:日志作为输入,经过一个Tokenization,transformer,attiation,学习阈值,控制boundry
logrobust:train,test,日志模板信息向量化,双向lstm加attention进行编码分类。
HitAnomaly:对于日志模板和参数分别采用Transformer进行编码。
细微的参数或模板上,
Logsy:Train和Test,测试数据源于新系统,同时最后将异常分数加入考虑。
Translog:19min第九
LogKG:弱监督