[论文解读 CCS 17] DeepLog Anamaly Detection and Diagnosis from System Logs through Deep Learning_deepsyslog论文-程序员宅基地

技术标签: 机器学习  异常检测  

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: 基于深度学习对系统日志进行异常检测和诊断

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hbhgyu/article/details/112514612

智能推荐

百度c语言贴吧 经典C源程序100例-2_c语言贴吧顶贴机源码-程序员宅基地

文章浏览阅读1k次。【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高    于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提    成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于    40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5_c语言贴吧顶贴机源码

偏向锁,轻量级锁与重量级锁_轻量级锁和偏向锁,重量级锁-程序员宅基地

文章浏览阅读256次。偏向锁Hotspot 的作者经过以往的研究发现大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程 ID。以后该线程在进入和退出同步块时不需要花费CAS操作来加锁和解锁,而只需简单的检验一下对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果存在,表示线_轻量级锁和偏向锁,重量级锁

TMS320C6678开发例程使用手册(7)_sa tic fir-程序员宅基地

文章浏览阅读608次。3.算法Demo例程演示所有工程均位于光盘"Demo\Algorithm\Application"文件夹内,本章节例程仅演示算法功能,算法与平台和系统无关,如需使用SYS/BIOS请自行移植。使用CCS工程导入和编译步骤导入例程。备注:本节提供的例程测试结果仅供参考。3.1FIR——有限长单位冲激响应滤波器此程序的作用是进行FIR有限长单位冲激响应滤波器测试。按照工程导入步骤加载FIR.out文件,然后点击程序运行按钮,程序会在断点处停下来。点击CCS菜单"Tools->Gra_sa tic fir

Spring AOP配置标签解析_spring-aop:5.0.8.release-程序员宅基地

文章浏览阅读1.2k次。准备Spring版本:5.0.8解析过程开启 Spring AOP 注解自动代理需要配置标签 <aop:aspectj-autoproxy/>,查看 spring-aop:5.0.8.RELEASE\META-INF\spring.handlers 文件,配置以下内容:http\://www.springframework.org/schema/aop=org.sp..._spring-aop:5.0.8.release

git命令大全_git diff testtag head --name-only | xargs tar-程序员宅基地

文章浏览阅读9.2k次。git操作配置.gitignore文件作用:可以屏蔽掉某些不需要被管理的文件或文件夹,如日志文件、临时文件等。git rm -r --cached .git add .git commit -m ‘update .gitignore’新建创建一个新的git仓库。这个版本库的配置、存储等信息会被保存到.git文件中# 初始化当前项目$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 在指定目录创建一个空的 Git _git diff testtag head --name-only | xargs tar

悲催的程序员,以及程序员的悲催-程序员宅基地

文章浏览阅读458次。我尽量用平和一点的口吻跟你说说关于程序员的那点事儿。1.我在一个叫摩托罗拉的公司干过,那地方有50%的人整天干的事情就是催另外25%的人没完没了的解剩下那25%的人造成的bug。我是个程序员,每天敲敲打打,哪天电脑崩溃了你会发现我这辈子啥都没留下。大多数人甚至都没有想过我们是怎么把手机捣鼓出来的,包括是是否人手一套乐高的家庭套装工具。我那可爱的岳父岳母在向自己的亲戚朋友们介绍我的时候,总是用一种充满自豪的口吻轻描淡写的说,他在摩托罗拉上班(我离开摩托罗拉以后他

随便推点

centos7 mysql允许连接_centos7 mysql允许远程连接设置-程序员宅基地

文章浏览阅读779次。Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作:一、允许root用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如下:在本机先使用root用户登录mysql:mysql -u root -p"youpassword"进行授权操作:mysql>GRANT ALL PRIVILEGES O..._centos7 mysql 允许客户端连接

【小Y学算法】️每日LeetCode打卡️——40.二叉树的后序遍历-程序员宅基地

文章浏览阅读1.3w次,点赞24次,收藏60次。没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。所以说,树倒了,没有一片雪花是无辜的

搬砖:ioctl函数,可以获取ip地址,修改ip地址,网卡地址等_if(ioctl(if_fd, i_push, "ip") < 0){-程序员宅基地

文章浏览阅读482次。Android配置ip地址ioctl函数,可以获取ip地址,修改ip地址,网卡地址等部分转自http://www.cnblogs.com/zht-blog/p/4025903.htmlint ioctl(int d, int request, ...);ioctl用来控制特殊设备文件的属性,第一个参数fd必须是一个已经打开的文件描述符,第三个参数一般为cha..._if(ioctl(if_fd, i_push, "ip") < 0){

USB-C 端口在您的 Mac 上无法使用如何解决?_macos 使用usbc 转接头 会提示 winusb-程序员宅基地

文章浏览阅读266次。由于 Mac 上缺少 USB-C 端口,即使一个端口停止工作,对许多用户来说也可能很麻烦。如果 MacBook 上的 USB-C 端口突然停止工作,请查看以下解决问题的一些可能解决方案。如何修复 USB-C 端口在您的 MacBook 上不工作重启你的 Mac如果 MacBook 上的 USB-C 端口突然停止工作,最简单的修复方法就是重新启动 Mac。在大多数情况下,这应该足以解决手头的问题并确保 MacBook 上的 USB-C 端口再次工作。更新到最新的 macOS 版本如果您的 MacB_macos 使用usbc 转接头 会提示 winusb

【计算机毕业设计】基于 SpringBoot+SpringCloud+Vue 电商秒杀系统-程序员宅基地

文章浏览阅读18次。基于 SpringBoot+SpringCloud+Vue 电商秒杀系统

C++编程规范---第9章 类的构造函数、析构函数与赋值函数_c++析构函数规范-程序员宅基地

文章浏览阅读574次。Blogdown--构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如 A(void);_c++析构函数规范

推荐文章

热门文章

相关标签