基于Log的异常检测-初印象

快速了解:

  1. 想要解决什么问题
  2. 具体用什么方法

DeepLog是李飞飞团队的文章,基于LSTM。

Presentation on Youtube: https://www.youtube.com/watch?v=At19CBGpbMI

问题阐述

每一行日志都是源代码的输出语句生成的。比如某个进程的源代码中的日志打印语句为printf("Accepted password for %s from %s port %d ssh2 \n", user, host, port),那么在程序的运行过程中,就可能会产生Feb 28 04:48:54 combo sshd(pam_unix)[6741]: Accepted password for root from 112.64.243.186 port 2371 ssh2。一条源代码打印出的日志为同一类型,其代码称为日志键。

系统产生的日志是有一定的逻辑性的,比如下面几条日志:

1 Jun 26 04:10:02 combo su(pam_unix)[1546] session opened for user news by (uid=0)
2 Jun 26 04:10:04 combo su(pam_unix)[1546] session closed for user news
3 Jun 27 04:02:47 combo su(pam_unix)[7031] session opened for user cyrus by (uid=0)
4 Jun 27 04:02:48 combo su(pam_unix)[7031] session closed for user cyrus

1 解决什么问题

1.1 执行路径异常

执行路径异常:一般的,日志会按照一定的顺序输出,分步记录了系统的状态,即文中的执行路径。相邻或者相近日志的关联度很高,一条日志往往取决于前一条或者前几条日志,当这种逻辑性被某条日志打破,则说明发生了日志执行路径异常。

image-20211108101113268

1.2 参数和性能异常

有些系统异常发生时,它的日志不会偏离正常的执行路径,但是它日志内的参数会与正常情况下的参数有较大差异。比如温度监控太高、CPU占用过多等。

1.3 工作流异常

image-20211108105807187

2 具体实现方法

当前常用的方法有:

  1. PCA based approaches over log message counter
  2. Invariant mining based methods to capture co-occurrence patterns between different log keys
  3. Workflow based methods to identify execution anomalies in program logic flows

2.1 日志收集+日志解析+特征提取

日志解析:把日志格式化,LogPAI的LogParser就是用来做日志解析的:https://github.com/logpai/logparser

特征提取:解析出来的日志键、参数等元素是字符串格式的,要把它们转换为可量化的数字来构造特征向量。整体日志解析+特征提取的过程如下:

image-20211108103142888

2.2 执行路径异常检测

我们可以将日志执行顺序看作成一个多分类问题,日志键的总数是一定的,我们看作为K,在训练阶段我们输入正常的日志执行序列,生成一个多分类器模型。在测试阶段,我们输入最近日志键的历史记录,输出是一个日志键的概率分布。在系统正常运行时,收集到系统产生的日志序列,经过日志解析和特征提取之后得到一个日志键序列,然后用LSTM模型去预测该序列后一条日志键的可能性,如下图所示:

preview

例如,假设一个来白正在执行过程的小日志文件被解析为一个日志键序列:{k22, k5, k11, k9, k11, k26}。给定一个窗口大小h=3,则训练DeepLog的输入序列和输出序列是:{k22, k5, k11 ->k9}, {k5, k11, k9 -> k11}, {k11, k9, k11 -> k26)。

如果实际情况中的下一条日志在可能性分布中具有较大的概率,那么认为这条日志属于正常日志,否则当序列预测的结果和实际结果误差较大时,我们则可以认为该日志属于异常。也就是说,如果新来的一条日志对应的log key不是接下来出现概率较大的log key,则视为异常。

图中可以看到最后预测不是单纯看Top1,而是TopN,这是考虑到现实中有种情况,y1可能是k1,也有可能是k2,不管k1还是k2都是正常的。所以选择用TopN可以提高这部分的检测准确率。

总结来说实现日志检测的原理其实就是利用深度学习进行序列预测。

后续

模板序列异常检测模型的缺点在于对模板使用one-hot向量编码,无法学习出不同模板之间的语义相似性。参数值异常检测模型的缺点在于建模的数量太多,有多少个模板就要建立多少个模型,实现起来工作量较大。针对上述问题,2019年与2020年Weibin Meng等人先后提出Template2Vec和Log2Vec方法,可以学习出模板之间的语义相似性,并且能够解决新模板的在线学习问题。

另外,看看数据集的日志样例:

preview

参考

https://saucer-man.com/machine_learning/475.html (有自己的理解)

https://www.cnblogs.com/bonelee/p/10457057.html (DeepLog介绍补充)

https://blog.csdn.net/ARPOSPF/article/details/103236241 (DeepLog中文翻译)

https://www.flyml.net/2018/08/06/论文阅读deep-log-初步小结/ (pre、数据集等)

https://zhuanlan.zhihu.com/p/346223794 (华为对DeepLog异常检测过程讲解地很详细)

https://github.com/AmateurEvents/article/issues/2 (基于日志做异常检测常见方法)

https://blog.csdn.net/qq_41773806/article/details/116052589 (temp2vec、log2vec介绍)

https://zhuanlan.zhihu.com/p/32829048 (N-gram模型介绍)

https://www.jianshu.com/p/9dc9f41f0b29 (LSTM模型介绍)

https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/ (LSTM新手实践最佳教程)