本篇文章将从日志异常检测面临的挑战、日志异常检测中的深度学习、以及日志异常检测算法评估和最后对日志异常检测的整体总结四个方面去讨论日志异常检测相关内容。
日志异常检测的挑战当前,日志异常检测面临的挑战主要有以下八点:
- 数据表示:深度学习模型接受结构化的数字形式的输入。
- 数据不稳定:随着应用程序的发展,可能会出现不在训练数据中的新日志事件类型。
- 数据不平衡:异常数据的数量远少于正常数据。
- 异常多样性:异常日志的表现内容是多样的,包括序列模式、频率、相关性、到达时间等。
- 标签可用性:带标注的日志是稀缺的。
- 流处理:日志是数据流,实时检测比事后分析更符合实际需求。
- 数据量大:日志数据的生成量很大,一些系统每天产生数百万甚至数十亿的事件,这对算法的效率有要求。
- 模型可解释性:基于神经网络的方法通常比传统的机器学习方法具有更低的可解释性。当涉及到针对关键系统行为或安全事件做出合理决策时,理解正确和错误分类背后的原因尤其困难。
常用的对无结构的日志做预处理方式主要有两种。第一种方法是最常见的方法,利用解析器对每条日志提取唯一的事件标识符以及事件参数值,提取方式有使用已知数据集的现有模式以及使用解析算法生成模式如Drain或Spell两种方式。第二种方式是基于token,将日志拆分为单词列表,如通过空格拆分。再删除特殊字符,如数字等。
需了解,深度学习最常用于揭示多个日志事件的异常模式,例如事件序列的变化或时间日志相关性。因此有必要在逻辑上将事件组织成组,然后单独或相互关联地进行分析。常见分组方式有两种,一种是滑动时间窗口,即一条日志会出现在多个窗口中;另一种是固定时间窗口,即一条日志只可能出现在一个组。后者粒度更粗,但便于计算。
预处理之后,则需要进行特征表示。特征表示主要有以下三种方式:
- 语义向量
语义向量:在自然语言处理领域,通常的做法是将句子中的单词转换为语义向量,这些语义向量对基于上下文的语义(例如Word2Vec、BERT)或语言统计(例如TF-IDF)进行编码。语义编码通常通过在特定日志文件上训练深度神经网络或通过预训练模型来实现。
位置编码:语义向量有时与位置嵌入结合使用基于它们在序列中的相对位置进行编码。为了将位置信息添加到编码的日志消息中,通常分别为偶数和奇数令牌索引使用正弦和余弦函数。
- 独热编码
独热编码是处理分类数据的最常用技术之一,经常应用于日志模式类型或令牌值的编码。形式上,有序列表d中的值i的一个热编码是长度为d的向量,其中第i个元素为1,所有其他元素为0。虽然大多时候将一个热编码数据直接用作神经网络的输入,但也可以将其与其他特征(如计数向量)组合,以便应用的神经网络能够识别输入并学习不同日志键的单独模型。
- 嵌入层/矩阵
嵌入层/矩阵:通常用于解决高维输入数据稀疏性问题。它们通常是随机初始化的参数,与分类模型一起训练,以创建日志消息的最佳向量编码。向量编码通常排列在矩阵中,使得通过将矩阵与一个热编码的日志向量相乘来获得特定日志密钥的相应向量。
与语义向量的主要区别在于,嵌入层/矩阵通常不针对NLP目标进行训练,即它们不旨在学习像Word2Vec这样的词的语义;相反,仅训练嵌入层/矩阵以最小化分类网络的损失函数。还使用基于深度学习的自定义嵌入模型;我们将其输出称为深度编码嵌入(DE)。这包括基于字符、事件和序列的嵌入[42]、使用MLP和CNN的注意机制[45]以及将标签信息输入VAE[1]的令牌计数。
- 自定义嵌入模型
基于深度学习的自定义嵌入模型包括基于字符、事件和序列的嵌入、使用MLP和CNN的注意机制等。
深度学习模型设计模型前则需考虑其操作模式,操作模式主要分为以下几类:
- 有监督:训练时使用所有训练数据的标签
- 半监督:训练时仅使用一部分有标签数据,和大量无标签数据
- 无监督:训练时不使用标签数据
- 在线:训练可在在线环境下完成,即模型可以动态更新
- 离线:训练需要在离线环境下完成
常见的深度学习模型中有 MLP、CNN,使用最多的是 RNN、LSTM、Bi-LSTM;Autoencoders 自编码器适合无监督场景,重构误差更高的是异常;GAN 则可生成式对抗网络。
常见实用的损失函数主要有以下几种:
- Cross-Entropy (CE):交叉熵,用于多分类问题;
- Hyper-Sphere Objective Function (HS):超球目标函数,到超球中心的距离即异常分数;
- Mean Squared Error (MSE):均方误差,用于回归;
- Kullback-Leibler Divergence (KL):KL散度,用于衡量概率分布的损失。Marginal Likelihood (ML):边缘似然,用处同KL;
- Custom Loss Functions (CF):自定义的损失函数。
- 离群值:离群值是指与整体日志内容不符的单条日志。常见的异常原因是:参数异常、时间异常、token序列异常。
- 顺序异常:当执行路径发生变化时,会检测到顺序异常,即生成日志的应用程序执行事件的方式与以前不同。这可能涉及以前未看到的事件类型的全新序列。
- 频率异常:频率异常仅考虑事件发生的数量。例如:描述文件打开和关闭的日志数量应该一样。
- 统计异常:基于超出事件计数的多个对数事件的某些定量表达特性的异常。如它们的到达时间间隔或季节性发生模式。称其为统计异常,因为它们的检测通常假设事件发生随时间遵循特定的稳定分布。
通常深度神经网络的输出用于异常检测时,神经网络的输出由其最后一层中的单个节点或多个节点组成。因此,从网络中提取的结果值是数值的标量或矢量。
一种可能的方案是将这些结果视为异常分数,该分数表示呈现给网络的日志事件在多大程度上表示异常。由于这些分数通常难以单独解释,因此通常有必要将其与某个阈值进行比较。在二分类(BIN)中,这种思想用于估计神经网络的输入是正常的还是异常的。对于监督方法,数值输出可以解释为输入对应于任一类的概率。对于半监督或无监督的方法,由于生成的异常分数通常不归一化,因此需要与经验确定的阈值进行比较。
另一种相关方法是利用自动编码器的重建误差,自动编码器首先在低维空间中对输入数据进行编码,然后尝试将其重建为原始形式。在这种情况下,如果输入样本难以重建,即产生大的重建误差,则认为输入样本异常,因为它们不对应于训练网络的正常数据。
异常与正常数据区分异常检测中区分异常与正常数据主要有以下两种方式:
- 标签:当网络输出直接对应于特定标签时,即可区分。
- 阈值;对于输出某种数值或异常分数的所有方法,直接使用阈值进行区分。
下图为是日志异常检测算法实验常用到的数据集。其中最常使用的是 HDFS、BGL、Thunderbird 和OpenStack。
异常检测方法的定量评估通常围绕着将正确检测到的异常样本数计数为真阳性(TP)、将错误检测到的非异常样本数计算为假阳性(FP)、将错误未检测到的反常样本数计为假阴性(FN)、将未正确检测到异常样本数统计为假阴性数(FN)以及正确未检测到的非异常样本作为真负(TN)。
其中评价指标包括精确性(precision)、召回率(recall)、F1 值以及正确率(accuracy)。
下图是常用的 Benchmark 的统计,Deeplog 是最常用的基准。Deeplog 依赖于 LSTM RNN 按顺序预测即将发生的日志事件。因此,如果观测到的事件预计以低概率发生,则认为是异常。Deeplog 是第一个使用深度学习检测日志数据中的顺序异常且是开源的,因此被经常作为 Benchmark。
总结- 日志异常检测的主要挑战是什么?
数据不稳定性是日志异常检测面临的主要,即未知日志的出现是算法要解决的主要问题之一。解决这一问题的关键思想是将日志表示为语义向量,将其与已知日志进行比较。转移学习提供了一种解决只有少量标记数据可用的挑战的方法,其中模型在一个系统上训练,并在另一个系统中测试。其主要思想是,由神经网络学习的日志事件模式在不同领域是相似的。
- 常用哪些深度学习模型?
RNN 是应用最广泛的模型,因为它们是捕获日志数据中顺序模式的自然选择。所有常用的日志数据集里的异常经常表现为顺序发生的事件,这一事实解释了 RNN 的趋势。CNN 为 RNN 的有效替代方案,因为它们还能够提取事件相关性。由于要支持无监督学习,因此也经常使用自动编码器。
- 如何预处理日志数据?
- 直接标记日志消息,不需要任何解析器,此方法简单,但缺乏对标记的语义解释。
- 通过解析消息并从日志事件集合(如序列、计数或统计)中提取信息。
- 从解析的日志事件中提取包括时间戳在内的参数。有多种方法可以将这些特征表示为深度学习模型所接收的数字向量。组成日志消息的 token 被表示为数字向量,并在其事件发生序列的上下文中考虑。大多数方法使用这些顺序特征,而频率、热编码数据和嵌入层使用较少或仅作为一个贡献特征。
- 检测到哪些类型的异常,以及如何识别这些异常?
大部分方法都侧重于在事件序列、事件中的令牌序列或两者的组合中出现的顺序异常。只有少数方法使用事件计数或将单个日志行检测为异常值,而不考虑其发生的上下文。异常的判定通常来源于神经网络的输出。二分类或多类分类的输出直接用于报告异常。无监督/半监督方法将所有数值输出(如异常分数或重建误差)与预定义阈值进行比较,或者使用日志事件的概率分布来判定。对于特定的日志文件,通常根据经验确定这些阈值。
- 如何评估模型?
大多数方法只使用四个数据集:HDFS、BGL、Thunderbird 和 OpenStack。评估通常基于异常序列进行,即整个日志序列被视为正常或异常,而不是单条日志。然而,长序列的一部分实际上可能代表正常的系统行为,而只有少数元素应视为异常。评估检测方法是否能够准确地确定序列的哪些部分是异常的,这对于系统操作员手动调查报告的异常也很实用。显然,这需要根据单个事件的粒度而不是以组来标记数据集。此外,几乎所有评估都依赖于 F1 等度量,这些度量在数据集高度不平衡时无法准确描述分类或检测性能。为了避免对评估结果的误解,可计算对类别不平衡更为稳健的指标,如真阴性率。
开源项目推荐云智慧已开源数据可视化编排平台 FlyFish 。通过配置数据模型为用户提供上百种可视化图形组件,零编码即可实现符合自己业务需求的炫酷可视化大屏。 同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置, 面向复杂需求场景能够保证高效开发与交付。
如果喜欢我们的项目,请不要忘记点击下方代码仓库地址,在 GitHub / Gitee 仓库上点个 Star,我们需要您的鼓励与支持。此外,即刻参与 FlyFish 项目贡献成为 FlyFish Contributor 的同时更有万元现金等你来拿。
GitHub 地址: https://github.com/CloudWise-OpenSource/FlyFish
Gitee 地址: https://gitee.com/CloudWise/fly-fish
,