基于Log的异常检测-初印象
快速了解:
- 想要解决什么问题
- 具体用什么方法
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 执行路径异常
执行路径异常:一般的,日志会按照一定的顺序输出,分步记录了系统的状态,即文中的执行路径。相邻或者相近日志的关联度很高,一条日志往往取决于前一条或者前几条日志,当这种逻辑性被某条日志打破,则说明发生了日志执行路径异常。
1.2 参数和性能异常
有些系统异常发生时,它的日志不会偏离正常的执行路径,但是它日志内的参数会与正常情况下的参数有较大差异。比如温度监控太高、CPU占用过多等。
1.3 工作流异常
2 具体实现方法
当前常用的方法有:
- PCA based approaches over log message counter
- Invariant mining based methods to capture co-occurrence patterns between different log keys
- Workflow based methods to identify execution anomalies in program logic flows
2.1 日志收集+日志解析+特征提取
日志解析:把日志格式化,LogPAI的LogParser就是用来做日志解析的:https://github.com/logpai/logparser
特征提取:解析出来的日志键、参数等元素是字符串格式的,要把它们转换为可量化的数字来构造特征向量。整体日志解析+特征提取的过程如下:
2.2 执行路径异常检测
我们可以将日志执行顺序看作成一个多分类问题,日志键的总数是一定的,我们看作为K,在训练阶段我们输入正常的日志执行序列,生成一个多分类器模型。在测试阶段,我们输入最近日志键的历史记录,输出是一个日志键的概率分布。在系统正常运行时,收集到系统产生的日志序列,经过日志解析和特征提取之后得到一个日志键序列,然后用LSTM模型去预测该序列后一条日志键的可能性,如下图所示:
例如,假设一个来白正在执行过程的小日志文件被解析为一个日志键序列:{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方法,可以学习出模板之间的语义相似性,并且能够解决新模板的在线学习问题。
另外,看看数据集的日志样例:
参考
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新手实践最佳教程)