持续集成 (CI) 作业会生成大量数据。当作业失败时,找出问题所在可能是一个繁琐的过程,需要调查日志以发现根本原因,而根本原因通常只占作业总输出的一小部分。为了更容易地将最相关的数据与其余数据分开,Logreduce 机器学习模型使用先前成功的作业运行进行训练,以从失败运行的日志中提取异常。
此原理也适用于其他用例,例如,从 Journald 或其他系统范围的常规日志文件中提取异常。
使用机器学习来减少噪音
典型的日志文件包含许多标称事件(“基线”)以及一些与开发人员相关的异常。基线可能包含随机元素,例如时间戳或唯一标识符,这些元素难以检测和删除。为了删除基线事件,我们可以使用 k-最近邻模式识别算法 (k-NN)。

日志事件必须转换为数值才能进行 k-NN 回归。使用通用特征提取工具 HashingVectorizer 使该过程能够应用于任何类型的日志。它对每个单词进行哈希处理,并将每个事件编码为稀疏矩阵。为了进一步缩小搜索空间,标记化会删除已知的随机单词,例如日期或 IP 地址。

一旦模型训练完成,k-NN 搜索会告诉我们每个新事件与基线的距离。

这个 Jupyter notebook 演示了该过程并绘制了稀疏矩阵向量的图形。

opensource.com
介绍 Logreduce
Logreduce Python 软件透明地实现了此过程。Logreduce 的最初目标是使用构建数据库协助 Zuul CI 作业失败分析,现在已集成到 Software Factory 开发工厂的作业日志流程中。
最简单的 Logreduce 可以比较文件或目录,并删除相似的行。Logreduce 为每个源文件构建一个模型,并输出目标文件中距离高于定义的阈值的任何行,语法如下:距离 | 文件名:行号: 行内容。
$ logreduce diff /var/log/audit/audit.log.1 /var/log/audit/audit.log
INFO logreduce.Classifier - Training took 21.982s at 0.364MB/s (1.314kl/s) (8.000 MB - 28.884 kilo-lines)
0.244 | audit.log:19963: type=USER_AUTH acct="root" exe="/usr/bin/su" hostname=managesf.sftests.com
INFO logreduce.Classifier - Testing took 18.297s at 0.306MB/s (1.094kl/s) (5.607 MB - 20.015 kilo-lines)
99.99% reduction (from 20015 lines to 1
更高级的 Logreduce 用法可以离线训练模型以供重用。可以使用基线的许多变体来拟合 k-NN 搜索树。
$ logreduce dir-train audit.clf /var/log/audit/audit.log.*
INFO logreduce.Classifier - Training took 80.883s at 0.396MB/s (1.397kl/s) (32.001 MB - 112.977 kilo-lines)
DEBUG logreduce.Classifier - audit.clf: written
$ logreduce dir-run audit.clf /var/log/audit/audit.log
Logreduce 还实现了接口,用于发现 Journald 时间范围(天/周/月)和 Zuul CI 作业构建历史的基线。它还可以生成 HTML 报告,在简单的界面中对多个文件中发现的异常进行分组。

管理基线
使用 k-NN 回归进行异常检测的关键是拥有已知良好基线的数据库,模型使用该数据库来检测偏离过远的行。此方法依赖于基线包含所有标称事件,因为任何在基线中找不到的内容都将报告为异常。
CI 作业是 k-NN 回归的绝佳目标,因为作业输出通常是确定性的,并且之前的运行可以自动用作基线。Logreduce 具有 Zuul 作业角色,可以用作失败作业后任务的一部分,以便发出简洁的报告(而不是完整的作业日志)。只要可以提前构建基线,此原理就可以应用于其他情况。例如,标称系统的 SoS 报告 可用于查找缺陷部署中的问题。

异常分类服务
Logreduce 的下一个版本引入了服务器模式,以将日志处理卸载到外部服务,在外部服务中可以进一步分析报告。它还支持导入现有报告和请求以分析 Zuul 构建。这些服务异步运行分析,并具有 Web 界面来调整分数和删除误报。

审查后的报告可以作为独立数据集存档,其中包含目标日志文件和记录在平面 JSON 文件中的异常行分数。
项目路线图
Logreduce 已经得到了有效使用,但是仍有许多改进该工具的机会。未来的计划包括
- 整理在日志文件中发现的许多带注释的异常,并生成公共领域数据集,以支持进一步研究。日志文件中的异常检测是一个具有挑战性的主题,拥有一个通用数据集来测试新模型将有助于识别新的解决方案。
- 将带注释的异常与模型一起重用,以优化报告的距离。例如,当用户通过将其距离设置为零来将行标记为误报时,模型可以降低未来报告中这些行的分数。
- 对存档的异常进行指纹识别,以检测新报告是否包含已知的异常。因此,该服务可以通知用户作业遇到了已知问题,而不是报告异常的内容。当问题得到解决时,该服务可以自动重启作业。
- 支持更多目标的基线发现接口,例如 SOS 报告、Jenkins 构建、Travis CI 等。
如果您有兴趣参与此项目,请在 #log-classify Freenode IRC 频道上联系我们。欢迎提出反馈意见!
Tristan Cacqueray 将在柏林 11 月 13-15 日举行的 OpenStack 峰会上,介绍 使用机器学习减少日志噪音。
2 条评论