image-20210110144334258

论文题目:DeepLog Anamaly Detection and Diagnosis from System Logs through Deep Learning

论文来源:CCS 2017 (Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communication Security)

论文链接:https://doi.org/10.1145/3133956.3134015

关键词:异常检测;深度学习;日志分析

0 摘要

系统日志的主要目的是在多个关键点记录系统状态和重要事件,以帮助调试系统故障和进行根因分析。因此,各种各样的日志可作为在线监控和异常检测的信息源。

基于以上事实,本文提出了一个使用LSTM的深度神经网络模型DeepLog,将系统日志建模成自然语言序列,这使得DeepLog能够自动学习到系统正常执行的日志模式,并在日志模式偏离模型学到的系统正常执行的日志模式时检测出异常。

此外,作者阐述了如何在线增量式更新DeepLog模型,使其可随时间适应新的日志模式。

DeepLog基于底层的系统日志构建工作流,当检测到异常,用户可以对异常进行诊断并进行有效地根因分析。

本文在大的日志数据集上进行了大量的实验评估,实验结果表明DeepLog表现优于现存的基于传统数据挖掘方法的基于日志的异常检测方法。

1 引言

2 预处理

2.1 Log parser

首先将非结构化的、自由文本的日志条目解析成结构化表示。一个有效的方法是从每个日志条目(log entry)抽取出“log key"(也称为消息类型)。log key是指源代码中的print语句中所包含的常量字符串k,比如log entry e=“Took 10 seconds to build instance”,log key就是”Took * seconds to build instance“,对应的print语句为printf("Took %f seconds to build instance.", t)。其中的参数值能够反映底层系统的状态和性能。

DeepLog为每个日志条目e存储了log key中的参数值以及它与上一条日志的时间间隔,并存入到向量 v ⃗ e \vec v_{e} v e

在OpenStack中执行一系列的虚拟机删除任务所产生的日志经过解析后的结果如表1所示。

image-20210110173857917

2.2 DeepLog架构

image-20210110174430880

DeepLog包含三个主要的组件:log key异常检测模型,parameter value异常检测模型以及workflow异常诊断模型。整体包括两个阶段:

  • 训练阶段:每个log entry被解析成一个log key和一个参数值向量(parameter value vector)。
    • log key序列用于训练log key的异常检测模型,建立系统执行工作流模型用于诊断目的;
    • 对每个log key,用其参数值向量训练参数值异常检测模型;
  • 检测阶段:如图所示。如果一个log entry被判断为异常,DeepLog工作流模型为用户提供诊断该异常的语义信息。DeepLog提供收集用户反馈的选项。(If the user reports a detected anomaly as false positive, deepLog could use it as a labeled record to incrementally update its models to incorporate and adapt to the new pattern)

2.3 威胁建模

3 异常检测

3.1 执行路径异常

image-20210110193906312

变量定义,输入输出,训练阶段,检测阶段(top g candidates)

3.1.1 传统的N-gram语言模型

作为基准方法

3.1.2 LSTM方法

image-20210110201053017

3.2 Parameter value异常

log key序列对于检测执行路径异常是有用的,但是存在一些异常并不表现为偏离正常的执行路径,而表现在不规则的参数值。

基准方法:将所有的参数值向量序列存到一个矩阵中,每一列是日志键k的参数值序列(注意:k可能有多列,取决于参数值向量的大小),每一行表示一个时间点 t i t_{i} ti。以表一的日志条目为例,对应的矩阵为:
{ t 1 − t 0 f i l e 1 I d n u l l n u l l n u l l n u l l n u l l t 2 − t 1 0.61 n u l l n u l l n u l l n u l l n u l l t 3 − t 2 } \left\{ \begin{matrix} t_{1}-t_{0} & file1Id & null & null & null \\ null & null & t_{2}-t_{1} & 0.61 & null \\ null & null & null & null & t_{3}-t_{2} \end{matrix} \right\} t1t0nullnullfile1Idnullnullnullt2t1nullnull0.61nullnullnullt3t2
给定上述矩阵,PCA和SOM等方法可以用于异常检测,这些方法能够获取到不同特征维度之间的相关性。但是,由于表1中k1和k2由于并发任务出现的顺序是任意的,并且由于日志键k的取值范围大,矩阵是稀疏的,使得该方法效果并不好。此外,无法为存在于一个参数值向量的自相关性建模(单个参数值向量随时间的序列中的模式)。

论文方法:DeepLog将一个log key(日志键)的所有参数值向量(parameter value vector)看成是一个时序序列,为每一个log key训练一个异常检测模型。例如表1中的k2,时序序列为:{[t2-t1, 0.61], [t2’-t1’, 1]}, 因此问题变成了一个多变量时序数据的异常检测。

论文采取与图3类似的LSTM网络来建模多变量时序数据,需要注意的是,为每一个不同的log key都训练了一个LSTM网络模型。

  • 输入:每个时间步的输入为该时间点的参数值向量,通过平均值和标准差进行标准化
  • 输出:基于历史的参数值向量预测下一个时间点的参数值向量
  • 优化目标:均方误差(MSE)
  • 异常检测:预测值和观测值之间的差异用MSE来衡量,本文并不是设置一个阈值用来判断异常,而是将训练数据划分为训练集和验证集,对于验证集中的每个向量v,基于验证集向量v之前的向量序列得到预测值,并计算预测值与v的MSE值。在每个时间步上,预测值和实际值的误差被建模成一个高斯分布。在使用时,如果预测值和观测值在上述高斯分布的高置信区间内,则认为是正常的;否则异常

3.3 异常检测模型在线更新

如果用户报告假阳性,将输入输出对{k1,k2,k3->k2}送入样本训练来更新模型的参数。

4 多任务执行的工作流构建

4.1 多任务中的日志条目分离

考虑的情形:用户程序重复执行不同的、逻辑上相关的任务,假设这些任务在时间上不重叠,但是相同的log key可以出现在多种任务中,且每种任务允许并发执行(如一个任务有多个线程)。

目标是将一个日志文件中的不同任务的日志条目分开,然后基于分离的日志条目的log key序列为每个任务建立工作流模型。

4.2 使用DeepLog的异常检测模型

4.2.1 日志键分离

基于log key异常检测模型,几种情形:

如果一个序列w总是跟随一个k,则Pt[mt=k|w]=1,例如,假设在一个序列"25->54",输出预测是"{57:1.00}",即“25->54->57”来自一个任务。

另一种情况考虑一个日志序列“54->57",假设预测的概率分布是{18:0.8, 56:0.2},这意味着下一步可能是”18“或"56"中的一个,这种模棱两可的结果可能是由于使用的历史日志序列长度不够,例如,如果两个任务共享相同的工作流程”54->57",第一个任务有一个模式"18->54->57->18",执行了80%的时间,第二个任务有一个模式"31->54->57->56",执行了20%的时间,可以通过具有不同历史序列长度的训练模型解决这个问题,在这种情况下,使用h=3而不是h=2,例如在上述序列“18->54->57"的例子中将会得出预测{18:1.00},在序列"31->54->57"的例子中将会得出{56:1.00}。

如果通过增加训练和预测的序列长度不能导致更确定的预测,继续确定是由于同一任务中的并发还是另一任务的开始引起的,将这个点称为分歧点。

image-20210111234839801

4.2.2 构建工作流模型

如图4.c所示。需要注意的是如何判断循环,即将重复的片段作为循环。

4.3 使用基于密度的聚类方法

image-20210112003843196

基于规则的工作流模型构建方法。

4.4 使用工作流模型

4.4.1 为Deeplog模型设置参数

参数包括h和g,h即历史日志序列的长度,h对性能有影响,过大的h对LSTM模型的预测精确度没有影响,因为LSTM能够忽略前面较远的日志信息。g是选取的前g个大概率预测日志类别,当观测值在这g个类别中则认为是正常的,否则为异常,g影响tp值和fp值。

使用工作流模型来设置h和g值。将h设置成最短的任务对应的工作流长度。可能的执行路径数量可作为g的值,因此将g设置成所有任务的工作流中所有分支点的分支数量的最大值。

4.4.2 使用工作流来诊断异常

image-20210112005722300

5 评估

5.1 执行路径异常检测

使用了HDFS和OpenStack两个数据集。其中,HDFS数据集采用公开数据集,OpenStack是作者采集的数据集,采集方法具体见论文。

image-20210112100648473

评价指标包括:FP值(False Positives),FN值(False Negatives),精度 P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP(表示所有检测出的异常中真正的异常占比),召回率 R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP(表示检测出的异常占所有异常的比例),F值 F − m e a s u r e = 2 ∗ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F-measure=\frac{2*Precision*Recall}{Precision+Recall} Fmeasure=Precision+Recall2PrecisionRecall(F1值是精度值和召回率的加权调和平均,当F1值比较高时说明方法比较有效)。

初始参数设置:g = 9, h = 10, L = 2, α = 64 \alpha=64 α=64 (表示LSTM隐藏向量的维度)

在HDFS数据集上的实验结果:

image-20210112102414058

image-20210112102531668

在OpenStack数据集上的实验结果:

image-20210112105148348

左侧的是随机产生的OpenStack数据集,右侧是规律生成的OpenStack数据集。IM在不规律的数据集上难以找到固定不变量(stable small invariants)。PCA是通过检测数据之间的方差,因此在规律的模式下效果不好。

image-20210112105714800

5.2 参数值异常检测

实验设置:使用OpenStack虚拟机创建任务的系统日志。通过一个脚本模拟多用户频繁请求创建和删除虚拟机,在OpenStack创建虚拟机时,一个重要的步骤是从控制节点向计算节点(创建虚拟机的节点)拷贝虚拟机镜像,通过控制控制节点和计算节点之间的网络带宽来模拟Dos攻击场景。

实验结果:将日志分为训练集和验证集,训练集用于训练模型,验证集用于生成预测值和实际值均方误差满足的高斯分布,在实际异常检测过程中,如果计算得到的均方误差在高斯分布的可接受置信区间内,说明是正常的,否则为异常。

列举了四个Log key。x轴为VM 被创建的id,其实就是程序的进程,y=mse。ab都为nomal, cd都分别有两次异常的情况。

image-20210112111703666

5.3 DeepLog的在线训练更新

image-20210112112313293

6 相关工作

7 总结

本文介绍了DeepLog,这是一种使用基于深度神经网络的方法进行在线日志异常检测和诊断的通用框架。 DeepLog学习并编码整个日志消息,包括时间戳,日志键和参数值。它在每个日志条目级别而不是在每个会话级别执行异常检测,因为许多以前的方法都受到限制。DeepLog可以从日志文件中分离出不同的任务,并使用深度学习(LSTM)和经典挖掘(密度聚类)方法为每个任务构建工作流模型。这样可以进行有效的异常诊断。通过整合用户反馈,DeepLog支持对其LSTM模型的在线更新/训练,因此能够整合并适应新的执行模式。对大型系统日志的广泛评估清楚地证明了DeepLog与以前的方法相比的优越性。

未来的工作包括但不限于将其他类型的RNN(递归神经网络)合并到DeepLog中以测试其效率,并集成来自不同应用程序和系统的日志数据以执行更全面的系统诊断(例如,MySQL数据库的故障可能是由磁盘故障引起,正如一个独立的系统日志中所示)。

参考:
译文-DeepLog: 基于深度学习对系统日志进行异常检测和诊断

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐