一、背景
通信网络中部署的大规模设备在运行过程中产生海量日志。
日志异常检测(Log Anomaly Detection,LAD)实时监控日志,识别并推荐根因异常,辅助运维人员定位故障根因,提升运维效率。
日志是一种时序文本数据,由时间戳和文本消息组成,实时记录了业务的运行状态。通过收集并分析日志,可以发现或预知网络中已发生或潜在的故障。
二、难点
1、目前日志规范不统一。不同类型的设备打印出的日志格式也不同,且日志数据呈现出非结构化的特点。主要体现在日志时间格式不统一,日志记录的级别不统一,不同厂家自定义的专业词汇或缩略语不统一。这些问题增加了日志分析的难度。
2、现代网络系统规模庞大,每小时打印日志约50Gb(约1.2亿~ 2亿行)的量级,若依靠人工分析日志数据来识别网络中是否发生了故障则效率低下。 因此有必要引入AI算法进行日志异常检测,以达到降低运维成本,显著提升业务体验的目的。
三、日志解析
日志处理与特征提取主要有日志模板挖掘技术和日志特征提取技术两种,用以从降低日志文本的异构复杂性、从海量日志中提取有价值的信息。
日志模板挖掘关注于日志中的常量部分,日志特征提取则关注于日志中的变量部分或其他特征。
日志模板挖掘技术可以划分为基于静态代码分析、基于频繁项集挖掘和基于聚类的日志模板挖掘技术;
日志特征提取技术可以划分为基于自然语言处理的日志特征提取技术、基于规则的结构化日志信息提取技术和基于统计模型的日志特征提取技术。
日志解析的目标是将原始日志消息转换为结构化的日志消息。
1、基于固定深度树的在线日志解析方法Drain
该方法能够以流的方式准确、高效的解析原始日志信息。可以从原始日志消息中自动提取日志模板,并将其分割为互不关联的日志组。使用一个具有固定深度的解析数来指导日志组搜索过程,这有效地避免了构造一个非常深且不平衡的树。另外,专门设计的解析规则被压缩编码在解析树节点中。
源码:https://github.com/logpai/Drain3
数据集:https://github.com/logpai/loghub
四、日志数据异常检测
现有的基于日志数据的异常检测方法主要分为3 类,分别是基于图模型的异常检测、基于概率分析的异常检测和基于机器学习的异常检测。
基于图模型的异常检测对日志的序列关系、关联关系以及日志文本内容进行建模;
基于概率统计的异常检测采用关联分析、对比等,计算日志与异常的关联概率;
基于机器学习的异常检测采用聚类算法找到离群值或分类算法学习故障时的日志模式,判断在线日志数据是否符合这些日志模式。
五、基于机器学习的日志异常检测
1、提取日志事件特征
完成日志解析,下一步就是要提取日志事件的特征,对于日志特征提取方式一般采用先将日志事件加窗,然后对每个窗口的事件进行计数,这样我们就可以生成最终算法可用的特征矩阵。
2、有监督算法
LR:逻辑回归是有监督的模型,将处理后的特征矩阵以及标记作为模型的输入,得到训练后的模型,用此模型预测新出现的特征向量,以此判断特征向量是否为异常的,进而判断日志异常。
决策树:特征矩阵每一列作为一个属性,事件次数作为属性值,特征矩阵和标示列作为决策树模型的输入,决策树可以根据多种指标进行属性分类的次序判断。得到的决策树模型即可用来日志异常的判断。
缺点:监督算法需要对数据进行标注,标注需要进行大量的人力劳动,往往在实际的使用中具有局限,不太容易广泛的应用于日志检测。
3、无监督算法
PCA:通过PCA获得二个子空间,即正常空间和异常空间,正常空间又PCA计算后得到的k维构成,异常空间由舍弃的的维度构成。对于新的特征向量,计算此向量到异常空间的距离,距离过长即判断异常。
聚类算法:聚类有二类指标,一是外部指标,另一种是内部指标。我们可以根据实际问题,合理选择具体的指标来进行训练任务。当选取好了指标,我们就可以根据指标计算对应的“距离”,完成对应的分类任务。
基于机器学习的日志异常检测的工具包:GitHub - logpai/loglizer: A machine learning toolkit for log-based anomaly detection [ISSRE'16]
六、基于深度学习的日志异常检测
1、DeepLog
文献来源:Du M , Li F , Zheng G , et al. DeepLog: Anomaly Detection and Diagnosis from System Logs through Deep Learning[C]// Acm Sigsac Conference on Computer & Communications Security. ACM, 2017.
DeepLog的总体架构如下图所示,分为训练和检测两个阶段。
在训练阶段,大量的系统日志数据被日志解析器解析为日志键和一个参数值向量的组合;然后使用这些日志键序列来训练一个日志键异常检测模型,并构建用于诊断目标系统执行工作流模型。对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。
在检测阶段,当一个新的日志记录到达时,它也被日志解析器解析为一个日志键和一个参数值向量的组合,然后使用对应内容经过对应异常检测模型进行检测,如果任一检测模型检测结果为异常,则将其标记为异常日志记录。
缺点:没有利用到日志之间的相关性
Template2Vec将模板编码成语义向量,以代替原始DeepLog中的模板索引或one-hot编码。
Template2Vec存在一个较大的问题:不能在运行态或推理态处理日志中词汇表外(OOV)的新词汇。
为了解决这一问题,提出了Log2Vec方法。Log2Vec主要包含两部分:日志专用的词嵌入(log-specific word embedding, LSWE)和新词处理器(OOV Word processor).
源码:https://github.com/d0ng1ee/logdeep
2、LogAnomaly
LogAnomaly在异常检测模型构建地方与DeepLog较为相似,在训练过程中也是使用日志模板进行异常检测(预测的过程对于oov问题使用语义向量来寻找最近邻的日志模板),使用lstm进行分类,类别为日志模板的个数,损失函数为交叉熵函数。
训练数据全部为正常日志数据,设定滑窗窗口后,此窗口使用原始的日志序列特征(Template Vector Sequence)再加上此窗口的统计特征(Count Vector),送进lstm网络的输出为滑窗下一时刻的模板日志的概率分布。
在进行异常检测时,如果概率最大的前k个预测结果中包含真实出现的日志模板,则认为正常,否则为异常序列。
源码:GitHub - d0ng1ee/logdeep: log anomaly detection toolkit including DeepLog
3、LogRobust
LogRobust直接舍弃了日志模板提取这一流程转而用语义向量来替代。
与前面采用滑窗(Sliding Window)来取样的策略不同,此处直接选取对应的磁盘序列为采样对象(Session window),采用有监督的训练方式,训练用到的磁盘序列数据人工标记为正常和异常。
对应磁盘序列的语义特征序列送入到lstm网络后直接训练一个二分类网络,预测时直接得到磁盘序列异常与否。
源码:GitHub - d0ng1ee/logdeep: log anomaly detection toolkit including DeepLog
4、GAN
为了处理时间序列数据,如下图所示使用LSTM-RNN神经网络构造GAN的发生器G和鉴别器D。
遵循典型的GAN框架,生成器G以来自随机潜在空间的序列作为其输入生成伪时间序列,并将生成的序列样本传递给鉴别器D,鉴别器D要将将生成的虚假数据序列与实际正常训练数据序列区分开来。
MAD-GAN框架不是独立处理每个数据流,而是同时考虑整个变量集,以便将变量之间的潜在交互捕获到模型中。
该框架在判别前用滑动窗口将多元时间序列分成子序列,为了根据经验确定子序列表示的最佳窗口长度,使用不同的窗口大小来捕获不同分辨率下的系统状态。
与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。
通过能够生成真实的样本,生成器G将已经捕获了训练序列的隐藏多元分布,并且可以被视为正常状态下系统的隐式模型。
同时,得到的鉴别器D也已经被训练成能够以高灵敏度区分虚假数据和真实数据。
在MAD-GAN框架中,使用G和D来完成异常检测任务的步骤分为: 重构基于从实时空间到GAN潜在空间的映射,利用实时测试样本和G重构样本之间的残差。
鉴别用鉴别器D对时间序列进行分类。如图所示,测试样本被映射回潜在空间,以基于重建的测试样本和实际测试样本之间的差异来计算相应的重建损失。
同时,测试样本还被馈送到训练好的鉴别器D,以计算鉴别损失。
DR值判断异常使用一种新的鉴别和重建异常分数DR-Score来组合两种损失,以检测数据中的潜在异常
源码:
https://github.com/LiDan456/GAN-AD
https://github.com/LiDan456/MAD-GANs
5、TadGAN生成对抗网络的时间序列异常检测
为了捕捉时间序列分布的时间相关性,本文使用LSTM循环神经网络作为生成器和判别器的基本模型。
TadGAN采用循环一致性损失进行训练,以实现有效的时间序列数据重建。除此之外,还提出了几种新的方法来计算重建误差,以及不同的方法来结合重建误差和临界输出来计算异常分数。
本文利用对抗性学习方法来获得两个映射函数E和G。
如下图所示,将这两个映射函数均视为生成器,E充当编码器,将时间序列映射到潜在空间;而G充当解码器,将潜在空间转换到重建的时间序列;判别器C区分来自x的真实时间序列和来自G(z)生成的虚假时间序列;而判别器Cz测量映射到潜在空间的有效性。
文中指出应用标准对抗损失的原始公式存在梯度不稳定和模式崩溃的问题。
模式崩溃是指在生成器与判别器的动态博弈之后,生成器其实是更倾向于产生那些已经被发现是“好”的样本来愚弄判别器,而不愿意产生新的样本,这导致生成器产生的样本多样性不足,无法完美收敛到目标分布。
因此,TadGAN的目标包括 Wasserstein loss 和 Cycle consistency loss ,前者是为了使生成的时间序列的分布与目标域的数据分布相匹配;后者是为了防止两个生成器之间产生矛盾。
源码:https://github.com/arunppsg/TadGAN
七、评价指标
评价指标通常包括精确率(precision)、召回率(recall)和综合评价指标F值(F-measure)。
八、落地难点
1、oov问题:对于新来的没出现过的日志,模型会判断为异常日志。解决方法:可选择距离新日志较近的日志模板。
2、模型训练只能使用正常日志的话,要保证数据干净,就算使用无监督模型打标签,也需要人工去检查,对于落地的实用性不强