Drain算法-笔记

简介

论文链接:https://jiemingzhu.github.io/pub/pjhe_icws2017.pdf
代码实现:https://github.com/logpai/logparser/tree/main/logparser/Drain

算法原理图:

image-20240927145439370

有几点注意:

  • 根节点和叶节点实际是一套规则,并不包含日志数据
  • 真正的日志数据在叶节点之下的Log Group
  • 第一层节点,基于假设: 具有相同日志事件的日志消息可能具有相同的日志消息长度
  • 第二层节点,基于假设: 日志消息开始位置的token更有可能是常量

Leaf Node 的计算

计算日志消息和每个日志组的日志事件之间的序列相似性:

\[\mathrm{sinSeq}=\frac{\sum_{\mathrm{i}=1}^\mathrm{n}\mathrm{equ}(\mathrm{seq}_1(\mathrm{i}),\mathrm{seq}_2(\mathrm{i}))}{\mathrm{n}} \]

seq分别是同一组内,两个日志的序列(以空格划分的字符串数组):

\[\text{equ}(\mathrm t_1 ,\mathrm t_2 )=\begin{cases}1&\text{if} \mathrm t_1 ==\mathrm t_2\\0&\text{otherwise}\end{cases} \]

如果stsimSeq≥st(阈值),那么Drain就会返回该组作为最佳匹配,否则返回一个标志位表示没有合适的。

更新解析树

如果在返回了合适的日志组,则Drain将当前日志消息的日志ID添加到返回的日志组中的日志ID中。此外,将更新返回日志组中的日志事件。

扫描日志消息和日志事件相同位置的token,如果两个token相同,则不修改该token位置上的token。否则,在日志事件中通过通配符*更新该token位置上的token。

如果无法找到合适的日志组,则根据当前日志消息创建一个新的日志组。

image-20240930154832679
posted @ 2024-09-30 15:51  漫漫长夜何时休  阅读(33)  评论(0编辑  收藏  举报