论文笔记:日志解析Drain

Drain: An Online Log Parsing Approach with Fixed Depth Tree


1. 背景

一般的数据挖掘模型所需要的数据为结构性数据(list or matrix)。原始日志通常是非结构化的,因此解析日志的目标为将非结构化的文本转化为结构化的数据。

传统的日志解析方法依赖于正则表达式(regular expressions)。但是正则表达式需要人工编写,需要大量人力,以及需要维护模板更新。

日志自动解析的方法一般是离线的,且需要固定数量的原始日志以训练出模板。而在线的自动解析方法则还不够准确高效,无法适应Web服务的日志解析。

2. 日志解析


原始日志消息是非结构化数据,包括时间戳和原始消息内容。 图1中的原始日志消息是在Amazon EC2平台上收集的简化的HDFS原始日志消息。 在解析过程中,解析器在每个原始日志消息的固定部分和可变部分之间进行区分。 常量部分是描述系统操作模板(即日志事件)的令牌(token),例如图1中的“接收块* src:* dest:*”; 而可变部分是携带动态运行时系统信息的其余令牌(例如“ blk 3587”)。 典型的结构化日志消息包含匹配的日志事件和感兴趣的字段(例如,HDFS块ID“ blk 3587”)。

3. Drain架构


根节点位于解析树的顶层;底层包含叶节点;树中的其他节点是内部节点。根节点和内部节点对专门设计的规则进行编码,以指导搜索过程。它们不包含任何日志组。解析树中的每个路径都以一个叶节点结尾,该叶节点存储了一系列日志组。每个日志组都有两个部分:日志事件和日志ID。日志事件是最能描述该组日志消息的模板,该模板由日志消息的恒定部分组成。日志ID记录该组中日志消息的ID。解析树的一种特殊设计是,所有叶节点的深度相同,并由预定义的参数深度固定。例如,图2中叶节点的深度固定为3。此参数限制了搜索过程中Drain访问的节点数,从而大大提高了效率。

3.1. 第一步:预处理

对于原始日志的处理,Drain允许用户预设一些简易的正则表达式,比如IP地址和block ID,那么Drain就会在一开始移除这些标识(token)。

3.2. 第二步:日志长度搜索

第二步和第三步中会使用解析树。这一步的日志长度搜索中的长度指的是原始日志中令牌(token)的数量。所以Drain的搜索树基于这样的假设:具有相同日志事件的日志消息可能具有相同的日志消息长度。

3.3. 第三步:基于历史令牌的搜索

在根据日志长度进行搜索后,可以在Drain解析树中进行长度节点选择。比如"Receive from node *"这条日志的长度是4,可以进入"Length:4"节点。然后根据日志的第一个令牌"Receive"进入不同的叶节点。此步骤基于以下假设:日志消息开始位置中的令牌更可能是常量。

在这一步中Drain的搜索长度可以根据解析树深度depth计算(depth-2)。如果depth为2的话,则只计算第二步。如果开头的令牌为变量的话,则用"*"来代替。

3.4. 第四步:使用令牌相似度进行搜索

在叶节点中包含了一组日志,这组日志长度都是4且开头都为"Receive"。Drain在这一步使用相似度算法simSeq来选择最合适的日志组。


seq1seq2表示日志信息,seq(i)是序列中第i个令牌。n为日志信息序列长度。equ函数为:


t1t2为两个令牌。通过simSeq计算出相似度最高的数值后,与预先设置的相似度阈值st进行比较。如果没有达到阈值,则没有合适的日志组。

3.5. 第五步:更新解析树

如果在第四步得到了合适的日志组,Drain将给当前的日志消息添加日志ID。相反的,日志组将更新。Drain会根据日志消息和日志事件对比令牌,如果两个令牌不同,则使用"*"来替代;如果找不到合适的日志组,将根据当前的日志消息创建新的日志组,从根节点重新遍历。

你可能感兴趣的:(论文笔记:日志解析Drain)