日志分析模型简介
日志分析模型是一款基于elk平台的数据分析工具。它主要通过访问es接口获取日志数据,然后通过一定的规则进行匹配日志,当某些链式关系的日志匹配时,可以说明当前的日志可能存在某些问题。我们就是要将大量的人工查找问题转化为自动匹配,让问题通过自动化的形式去通知用户。
以前的日志分析模型算法
场景:假如现有日志链:A->B->C(抽象出来的规则),当前供分析的日志大概有10000条,我们想要在这1w条日志中查找是否存在A->B->C链式关系。
按照以前的算法,我们先拿出一条日志,然后依次匹配A,B,C,将匹配的结果放在一个二维列表中,这样当我们全部遍历完成之后,就可能这个二维列表非常大,并且我们还需要对这个二维列表中的匹配元素进行笛卡尔积(排列组合),最终检索是否存在A->B->C的链式关系。
我们先来分析下这个算法:首先,这个算法遍历1w条数据时,他匹配了3*1w次,如果这个匹配耗时不大的情况下还好,如果耗时非常大,再加上真实生产环境中上十亿级的日志量,这会非常的浪费时间;其次,对于笛卡尔积运算,不知道有老哥尝试过没有,这是相当慢的,我在计算耗时时,发现耗时最长的就是在这里;再者,笛卡尔积之后,还需要进行匹配链式关系A->B->C,这又是大大的增加了计算量。最终,我选择了重构这个算法。
重构算法构思
在重构时,最先考虑的是建立什么样的模型更适合人的理解。当时供选择的方案有:类似于快速排序的算法,从两段查找;树形节点,以及二叉树等。最终我们选择了树形节点的构思。首先,它更符合我们人类的思维。其次,树形节点能更好的体现父节点和子节点的关系(也就是链式关系中查找的先后顺序问题)。最后它能大大减少匹配的次数,以及不需要复杂的笛卡尔积运算。
算法实现
首先,我们抽象了一个模型为一棵树结构,树上的节点抽象为链式关系中的一个点,链式关系抽象为父节点与子节点的关系。
在抽象完模型之后,实现最为核心的匹配模式。在匹配模式中,我们先去从根节点开始匹配,在匹配根节点的情况下,再去匹配根节点的子节点,直到匹配的节点没有子节点时,我们认为该条链式关系已经匹配完成。
题外话
写这篇文章是在回家过年的火车上完成的,所以没有图来说明模型的优点。忘大家见谅!