log-anomaly-detector (LAD)
LAD是Red hat 开发的,一个基于机器学习的Log日志异常检测命令行工具
文章目录
1. 安装
环境要求:python 3.6 或以上
直接安装会出错,为了避免后续的错误,需要预先安装以下几个依赖(后装的话会出错):
pip install git+https://github.com/compmonks/SOMPY.git
pip install ipdb
pip install tornado==5.1
pip install python-dateutil==2.8.0
pip install opentracing-instrumentation==3.2.1
然后安装LAD:
pip install log-anomaly-detector==0.0.2
安装需要几个小时,之前的版本使用UI Command时会有bug,作者在0.0.2版本中修复了
查看是否安装成功:
log-anomaly-detector --help
报错解决:
pip install git+https://github.com/compmonks/SOMPY.git
pip install ipdb
- 报错2:
解决方法:
pip install tornado==5.1
pip install python-dateutil==2.8.0
pip uninstall opentracing-instrumentation
pip install opentracing-instrumentation==3.2.1
2. 示例
Command
参数及其用法(方括号中为可选参数):
log-anomaly-detector [main-options] <command> <subcommand> [subcommand-options] [parameters]
首先去github上clone整个项目
git clone https://github.com/AICoE/log-anomaly-detector.git
测试用例:
$ cd log-anomaly-detector
$ log-anomaly-detector run --config-yaml config_files/.env_cmn_log_fmt_config.yaml --single-run True
这里有个bug,需要修改 config_files/.env_cmn_log_fmt_config.yaml 文件的前两行为1行:
STORAGE_DATASOURCE: "local"
正常运行页面:
UI Command:
参数及其用法(方括号中为可选参数):
export SQL_CONNECT="mysql+pymysql://{USERNAME}:{PASSWORD}@localhost/factstore"
export CUSTOMER_ID="test1"
log-anomaly-detector ui --port 8080 --debug True
实际用例:
export SQL_CONNECT="mysql+pymysql://root:123456@3.3.6.12/factstore"
export CUSTOMER_ID="test1"
log-anomaly-detector --metric-port 8081 ui --port 9999
可以打开fact store(用来反馈false positive):
提交false positive成功:
3. 结构
该框架由三个组件组成。
机器学习Core(LAD Core)
包含自定义代码以训练模型并预测日志行是否异常。目前只有无监督方法,基于W2V(Word2vec)和SOM(自组织图)。我们计划添加更多模型。 监控(指标)
指标 ( Metrics)
为了在生产中监控此系统,利用了grafana和prometheus来可视化此机器学习系统的运行状况。
grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具。
Prometheus 是一套开源的系统监控报警框架。
反馈回路(Fact Store)
有一个元数据注册中心,用于跟踪机器学习系统中来自false_positives的反馈,并提供一种用于ML自我校正错误预测的方法,称为 Fact Store。
4. Machine Learning Core
Language Encoding, Word2Vec
日志消息是可变长度的字符串,需要将它们转换为固定长度的向量表示,机器学习算法可以使用这些向量表示。这里使用了python gensim 包中的 Word2Vec,其具有将单词转换为数值向量的强大能力,可以保留其大部分语义。
SOM
自组织映射 ( self-organizing map, SOM ) 是一种无监督的学习算法,用于帮助我们量化日志的异常性。
SOM的工作原理
SOM是一个单层的神经网络,只有输入层和竞争层两层:
竞争层的神经元采用竞争的方式激活,每个神经元有一个权值向量
w
w
w ,输入向量
x
x
x 会激活与之最接近的神经元,这个神经元叫做获胜神经元(winner)。
下图展示了 SOM 的训练过程。紫色区域表示训练数据的分布状况,白色网格表示从该分布中提取的当前训练数据的映射。首先,SOM 节点位于数据空间的任意位置,最接近训练数据的节点(黄色高亮部分)会被选中。它和网格中的邻近节点一样,朝训练数据移动。在多次迭代之后,网格倾向于近似该种数据分布(下图最右)。
最终的效果就是对数据进行了聚类,每个神经元代表一类。这一类所包含的数据,就是能够使它竞争获胜的那些数据。
训练计算过程
Step 1:与其他神经网络相同,需要将
W
e
i
g
h
t
s
Weights
Weights初始化为很小的随机数
Step 2:随机取一个 输入样本
X
i
X_i
Xi
Step 3:遍历竞争层中每一个节点:计算
X
i
X_i
Xi与节点之间的相似度(通常使用欧式距离),选取距离最小的节点作为优胜节点(winner node),有的时也叫BMU(best matching unit)
Step 4:根据邻域半径
σ
σ
σ(sigma)确定优胜邻域将包含的节点;并通过neighborhood function计算它们各自更新的幅度(基本思想是:越靠近优胜节点,更新幅度越大;越远离优胜节点,更新幅度越小)
Step 5:更新优胜邻域内节点的
W
e
i
g
h
t
Weight
Weight
Step 6:完成一轮迭代(迭代次数+1),返回Step 2,直到满足设定的迭代次数
推理阶段,离最近的神经元结果较远的点是异常点,这里需要设定一个最长距离的阈值参数。
SOM的详细原理可参考:
https://www.zhihu.com/question/28046923
https://zhuanlan.zhihu.com/p/73534694
模型结构
通过W2V将log文本转换为数值向量,生成的向量输入SOM中,进行异常检测模型的训练和推理。
5.Metrics
Fact Store Metrics
用于查看Fact Store部署成功的指标。
Core Metrics
用于可视化正在运行的ML作业和发现false positives。
6. Storage
数据源(Source)和数据接收(Sink)可以有多种存储形式:
7. demo数据格式
项目里给了Local形式数据的例子
输入数据
分为两种:json和txt格式
json格式:
txt格式:常规 log 格式: timestamp severity message
输出数据
json格式:
8. 总结
该工具基于word2vec和SOM算法,可以实现对单条Log日志的异常检测。
总的来说项目较为完整,但其上线不久且用户不多,因此代码中尚存在一些Bug需要修改。