日志异常检测-机器学习

日志搜集:大规模系统通常会生成日志来记录系统状态和运行时信息,每个日志都包括时间戳和指示发生了什么的日志消息。

日志解析:日志是非结构化的,包含自由形式的文本。日志解析的目的是提取一组事件模板,从而可以构造原始日志。更具体地说,每个日志消息都可以被解析成带有一些特定参数(可变部分)的事件模板(恒定部分)。

特征提取:将日志解析成单独的事件后,编码成数字特征向量。使用不同的分组技术将原始日志分割成一组日志序列,包括固定窗口、滑动窗口和会话窗口。对每个日志序列,生成一个特征向量(事件计数向量),表示每个事件的发生次数。所有特征向量形成特征矩阵,即事件计数矩阵。

异常检测:将特征矩阵馈送给机器学习模型进行训练,生成异常检测模型。

特征提取

输入是日志解析步骤中生成的日志事件,输出是事件计数矩阵。

固定窗口:基于时间戳,每个窗口固定大小,

滑动窗口:由两个属性组成,窗口大小和步长,如:每小时窗口每五分钟滑动一次。通常步长小于窗口大小,因此会导致不同窗口的重叠。

会话窗口:基于标识符而不是时间戳,标识符用于在一些日志数据中标记不同的执行路径。如:带有block_id的HDFS日志记录了某些数据块的分配、写入、复制和删除。根据标识符对日志进行分组,其中每个会话窗口都有一个唯一的标识符。

在利用窗口技术构建日志序列之后,生成事件计数矩阵X。在每个日志序列中,我们计算每个日志事件的发生次数,以形成事件计数向量。例如,如果事件计数向量是[ 0、0、2、3、0、1、0 ],这意味着在这个日志序列中,事件3发生了两次,事件4发生了三次。最后,大量事件计数向量被构造成事件计数矩阵X,其中条目Xi, j记录了事件j在第i个日志序列中发生了多少次。

不变量挖掘异常检测方法:线性关系,在不同的输入和工作负载下,系统运行始终保持这种关系。相同会话id (如:HDFS中的块id ) 的日志通常表示该会话的程序执行流程。程序执行流程如下图,

日志异常检测-机器学习_第1张图片

在这个执行流程中,系统在从A到G的每个阶段都生成一条日志消息。假设系统中运行着大量的实例,并且它们遵循图4中的程序执行流程,下面的等式将是有效的:

n(A) = n(B)
n(B) = n(C) + n(E) + n(F)
n(C) = n(D)
n(G) = n(D) + n(E) + n(F)

其中n(*)表示属于相应事件类型*的日志数量。不变量挖掘可以揭示代表系统正常执行行为的多个日志事件之间的线性关系(例如,n ( A ) = n ( B ) )。

线性关系在现实世界的系统事件中占主导地位。例如,文件打开后必须关闭。因此,带有短语“打开文件”的日志和带有短语“关闭文件”的日志将成对出现。如果实例中日志事件“打开文件”和“关闭文件”的数量不相等,它将被标记为异常,因为它违反了线性关系。

不变量挖掘旨在寻找不变量(即线性关系),包含三个步骤。不变量挖掘的输入是从日志序列生成的事件计数矩阵,每行都是事件计数向量。

首先,利用奇异值分解估计不变空间,确定下一步需要挖掘的不变量r。其次,该方法通过强力搜索算法找出不变量。最后,通过将其支持度与阈值(例如,98 %的事件计数向量支持)进行比较,验证每个挖掘的不变候选。该步骤将继续,直到获得r个独立不变量。在基于不变量的异常检测中,当新的日志序列到达时,检查它是否遵循不变量。如果至少有一个不变量被破坏,日志序列将被报告为异常。不变量挖掘可以高精度地检测异常,为每个检测到的异常提供有意义和直观的解释,但不变量挖掘过程非常耗时。

有监督的方法:利用机器学习包scikit-learning来实现Logistic回归、决策树和SVM的学习模型。

无监督的方法:

不能直接使用scikit-learn中的聚类API,因为它不是为大规模数据集设计的,数据不适合内存。将聚类算法实现为在线版本,其中每个数据实例被一个接一个地分组为一个聚类。

不变量挖掘方法:为可能的不变量建立了搜索空间,使用多种方法来修正不必要的不变量。

参考:

基于系统日志分析进行异常检测 · Issue #2 · AmateurEvents/article · GitHub

你可能感兴趣的:(AIOps,机器学习)