1、基于大规模网络日志的模板提取研究 崔元 张琢 东北师范大学信息与软件工程学院 教育部数字化学习支撑技术工程研究中心 摘 要: 针对直接从大型网络日志中提取网络事件困难的问题, 提出了基于大规模网络日志的模板提取方法。该方法可将海量的、原始的网络日志主动转换为日志模板, 从而为了解网络事件的根因和预防网络故障的发生提供重要的前期准备。首先分析日志的结构, 将日志中的词划分为模板词和参数词两类;然后从 3 个不同的角度切入, 分别对日志进行模板提取研究;最后使用互联网公司中的实际生产数据, 采用 Randindex 方法来评估 3 种提取方法的准确有效性。结果表明, 在从服务集群中收集来的 4 种
2、不同消息类型中, 基于标签识别树模型提取到的日志模板的平均准确率达到 99.57%, 高于基于统计模板提取模型和基于在线提取模板模型的准确率。关键词: 切词; 提取模板; 统计聚类; 标签识别树; 在线聚类; 作者简介:崔元 (1990-) , 女, 硕士生, 主要研究方向为数据挖掘;E-mail:;作者简介:张琢 (1968-) , 女, 博士, 教授, 主要研究方向为信息检索、数据挖掘, E-mail:zhangzhuo_。Research on Template Extraction Based on Large-scale Network LogCUI Yuan ZHANG Zhuo
3、School of Information and Software Engineering, Northeast Normal University; Abstract: Aiming at the problem of extracting network events directly from large-scale network log, a template extraction method based on large-scale network log was proposed.The method can automatically convert the massive
4、 and original network logs into log templates, so as to provide important pre-preparation for understanding the network events root causes and preventing the occurrence of network failure.Firstly, the structure of the log is analyzed, and the words in the log are divided into two types:template word
5、 and parameter word.Then, from three different angles, the log template extraction is studied respectively.Finally, the actual production data of the Internet company is used, and Randindex method is used to evaluate the accuracy and validity of the three extraction methods.The results show that the
6、 average accuracy of the log templates based on the tag recognition tree model is 99.57%, which is higher than that of the four different types of messages collected from the service cluster.Keyword: Cut words; Extract template; Statistical clustering; Signature tree; Online clustering; 1 引言随着网络元素和网
7、络服务数量的增加, 所产生的网络日志被网络服务者视为用于监控网络健康和故障排除的重要数据源之一。而网络服务的多样性使得网络事件的关系变得更加复杂化, 例如一个普通的连接断开事件不仅会导致邻近节点无法正常工作, 还可能导致虚拟路径连接断开或导致相关的服务全都无法正常工作。而在大型生产网络中, 由于其记录的日志信息数量庞大且格式多样化, 直接从中分析出网络事件已经成为一个具有挑战性的任务。通常情况下, 采用网络管理系统 (NMS) 来监控网络, 并使用简单网络管理协议 (SNMP) 或系统日志触发器应对每天发生在大型网络中的网络事件。NMS 采用预定义的规则, 当出现报警时, 表明网络已到达明显的
8、临界状态。尽管 NMS 具有根因分析功能, 但是它需要领域知识且不能够识别出详细的网络事件。Meta2和 TAR3都是故障定位系统, 它们可以从事件数据集中自动学习故障事件, 并通过索引网络事件快速找到故障的根因。但是, 以上两者均依赖于 NMS 收集的网络事件数据。除此之外, NMS 的警报是模糊的, 网路管理者不能够捕获例如网络层、协议或者服务依赖的网络事件的影响或结构。因此, 在进行网络异常检测之前要先获取网络事件的结构。本文在不依赖领域知识和 NMS 数据的前提下, 将研究范围放在原始日志 syslog上, 从原始日志数据 syslog 中主动提取网络事件, 从而为根因诊断、故障检测和
9、预防打下基础。然而, 直接从 syslog 中发现网络事件是极为困难的, 其原因有两个:1) 日志非结构化。日志消息是由不同的供应商提供的规则所产生的不同的非结构化文本消息。由于大型网络供应商包含了多样的元素, 导致日志也非常多样化。2) 日志复杂化。网络设备如路由器、交换机、跨多个地理位置的服务器等发生的网络事件均会产生日志基于以上原因, 需要转换思路, 直接从 syslog 中提取网络事件从 syslog 模板中提取网络事件, 具体来说就是先从原始日志中提取日志模板, 再在日志模板中提取与网络事件有关的信息5, 从而达到从原始 syslog 中提取网络事件的目的。因此本文的目标是获取日志模
10、板。虽然模板可以从供应商提供的手册中获得, 但是由于网络设备的升级更新, 日志格式可能会发生变化, 并且一些供应商并不会公开自己的日志手册, 因此这样获取模板的方式就会受到阻挠。基于此, 本文提出了基于海量日志的模板提取模型, 从 3 个不同的角度切入, 分别对日志进行模板的提取, 并使用某互联网公司的真实生成数据对 3 种方法进行比较。本文详细说明了 3 种提取日志模板的方法, 并对 3 种方法做出相应的优化, 最后在研究总结第 3 种方法时, 提出了主动提取日志模板的方法, 弥补了前两种方法的不足。提取日志模板的研究是最为重要的, 因为该分析是提取网络故障的隐藏网络事件、理解网络异常的根源
11、和影响以及进行预防性维护操作的基石, 后面的工作都需要围绕和使用日志模板来展开。2 网络日志结构分析网络日志数据, 如路由器系统日志和警报, 包含各种信息 (网络故障信息、安全问题信息和控制台日志信息) 。由于日志 syslog 的格式取决于服务类型或供应商, 并且是自由形式的文本, 因此其语法和语义也不尽相同4,11。但我们依然可以在 syslog 中观察到固定不变的短文本 (表 1 列出了来自两个路由器供应商的日志示例) , 包括以下 3 个核心结构。1) Time stamp:指日志消息生成的时间戳;2) Message-type:指日志消息的类型, 通常有 notice, error
12、等;3) Detail Message:指日志消息的详细信息。该部分一般包括两个部分:代表状态变化 (例如 up/down) 的部分和代表参数 (例如 IP 地址、主机名和进程 ID等) 的部分。表 1 网络日志部分消息 下载原表 3 基于统计模板提取模型3.1 切词评分既然要提取日志的模板, 就需要将日志中的单词进行区分, 确定哪些词是模板词, 哪些词为参数词, 而模板词就可以组成日志的模板。因此需要先对日志进行切词。假设每个消息中的单词都是用空格分割开的, 那么就可以以空格进行切词, 从而将得到的单词分为两类:模板词 (Template Words) 和参数词 (Parameter Wor
13、ds) 。一般来说, 模板词通常会出现在具有相等长度 len 的日志消息的相同位置 p 上。因此在切词过程中, 记录下单词的位置和日志消息的长度 (p, len) 。使用基于条件概率的计算公式得出每个单词作为模板词的可能性, 将此概率作为该词的得分, 评分规则如下。如果一个单词出现在长度为 len 的日志消息的第 p 个位置上, 那么这个单词的分数 Score 可以依据式 (1) 计算:其中, p 表示 word 出现在日志的位置下标, len 表示日志消息中单词的个数, 即句子的长度。3.2 基于 DBSCAN 聚类单词通过 3.1 节对单词评分之后, 需要确定一个词是参数词还是模板词。一个
14、简单的方法是设置一个阈值, 然而这种方法会存在问题, 即阈值大小的确定。如果阈值设置偏大, 就会使得本应该属于模板词的单词被误认为参数词, 最终获取出来的模板中表达的信息较少, 不利于为后面的相关分析提供帮助;但如果将阈值设置得偏小, 便会出现很多伪模板词, 使得日志模板中包含了较多的具有变化因素的参数词, 这样会对网络事件的提取造成干扰。为了避免上述情况, Kimura6提出利用统计聚类算法来获取日志模板的方法。此处基于 Kimura 提出的思想, 采用了基于密度的空间聚类算法 (DBSCAN) 聚类技术10, 该技术需要确定单词之间的密度、距离、半径以及最少数点的值。确定完成之后, 即可通
15、过该聚类算法将日志消息中的单词分为多个类别, 并且类别之间的距离大于某个阈值。3.2.1 确定聚类的相关参数首先确定聚类算法的相关参数:Eps 和 MinPts。这里需要指定 Eps 和 MinPts 两个参数。但对于非专业或非领域内的人员来说, 直接指定出恰当的值较为困难, 故本文参考文献1中的参数自适应动态选择方法对 Eps 和 MinPts 进行确定, 基本思想为先采用 k-均值的聚类思想对点进行初步分类;然后统计每个类中的各个点之间的距离, 该距离本文采用二维欧几里德距离公式计算得到;最后再根据正态分布原理, 为每个类指定恰当的 Eps 和 MinPts 参数1。3.2.2 基于 DB
16、SCAN 聚类日志模板将 DBSCAN 的参数设置为 3.2.1 节得到的最优参数, 然后将单词评分作为聚类算法的输入, 将单词分为多个簇, 并从概率最高的簇开始, 按照概率降序的顺序, 依次从对应的簇中取出单词并加入模板中, 直到在句子长度相同的条件下, 模板词所占句子的比例大于 为止, 其中 01。图 1 为该模型的伪代码。图 1 基于聚类统计提取模板 下载原图3.3 参数的选择从获取模板词数量的角度来进行分析, 根据以上算法, 当 减小时, P 条件较容易满足, 使得很多模板词被丢弃, 从而造成模板词和模板数量过少, 进而提取不到有价值的信息;当 增大时, 会使得很多不该成为模板词的单词
17、被当成模板词添加到日志模板中。根据以上讨论并通过咨询互联网数据操作团队, 最后选定 =0.75, 此时提取出来的模板词最为可靠。4 基于标签识别树模板提取模型4.1 消息类型与子类型结合第 2 节和表 1 可知, 日志的第二个结构消息类型 (Message-type) 是用来描述消息的特性的。然而其所表达的粒度较大, 很多关于消息类型的细节并不清楚, 故在日志的第三个结构详细信息 (Detail Message) 部分做出补充。因为该部分包含了大量的内容, 故着重从该部分进行分析是本文模板提取模型的重点。可以从中发掘出多个子类型9, 这些子类型就是我们需要的日志模板。如表 2 所列有 8 条日
18、志, 其中包含两类日志消息类型, notice 和warning。表 2 日志类型示例 下载原表 从表 2 的示例中可以看出, Message-type 分为 notice 和 warning 两类, 以Message-type=notice 时的日志的详细信息部分为例, 即日志编号依次为 1, 2, 3, 4, 7, 8 的 detail message。从表 2 中可以发现, ae2, ae3 字段在每条消息之间是不同的, 更趋向于参数词。当把这两个字段用相同符号替换后 (用星号*替换, 如表 3 所列) 会发现, 只剩下 3 种不同的结构类型, 即日志的子类型, 故可以说在 Messag
19、e-type=notice 时, 日志有 3 个子类型。然而在实践中, 因为所有需要替换的部分没有明显的模式, 如 IP 地址、vrf ID、交换机 ID 等各不相同, 在没有领域知识的前提下, 手动区分和找到需要替换的部分将十分困难。表 3 日志子类型示例 下载原表 4.2 模板树的构造根据 4.1 节的问题, 即在不需要领域专家干预的条件下自动获取如表 3 所列的子类型的问题, 本文的解决办法源于用于垃圾邮件检测的签名抽象4。其思想是子类型标签节点是具有高频单词的组合, 这里把子类型标签节点映射为日志中频繁出现的单词组合, 主要思路如下。(1) 切词:将消息通过空格分隔为单词。(2) 获取
20、词频:统计在该日志块中不同 Message-type 下各个单词出现的次数。(3) 组合单词:判断在单词 A 出现时, 单词 B 总是同 A 一起出现。如果 A 和 B 的词频相同且同时出现, 则将 A, B 两个单词作为单词组合, 作为模板树上的一个节点, 如图 2 所示。图 2 日志子类型模板树 下载原图对于每种类型的消息, 作为模型的输入, 构造一棵树用来表示模板作为输出, 如图 2 所示的日志模板树。当一个单词出现在消息中时称做关联。详细的构造算法的过程依赖广度优先搜索 (BFS) 遍历。首先将消息类型 (例如 notice) 作为树的根。然后给定父节点, 寻找最频繁单词组合作为子节点
21、, 重复此过程, 根据剩余消息创建子节点, 直到所有消息都已关联。最后继续递归到子节点并重复该过程。这种方法是非常通用的, 因为是根据单词频率进行模板提取而不是基于文本语义进行提取, 因此解决了在不需要领域专家干预的条件下, 自动获取子类型的问题。4.3 模板树构造算法的优化由于上节提到的递归方法需要频繁地重新切词来获取最高频率词组, 会增加时间消耗, 故优化此算法, 只在最开始进行一次切词工作即可。采用一个对象容器 WordSeg 实时记录最新的词频和相应的句子索引集合, 即 key 为单词, value为该词的词频和句子索引集合。具体数据结构如表 4 所列, 其表示初始状态。在求解模板树的
22、子节点的过程中, 先将该词的句子索引集合与父节点的句子索引集合求交集, 再与该词在同一层级的兄弟节点的句子索引集合求差集, 从而可以快速找到词频最高的单词或单词组作为模板树的子节点。表 4 WordSeg 数据结构 (初始状态) 下载原表 结合图 2 举个例子, 为了叙述方便, 先进行以下约定。1) 节点 changed state to:节点 nodeA;2) 节点 Interface:节点 nodeB;3) 节点 Vlan-interface:节点 nodeC;4) 节点 Up:节点 nodeD;5) 节点 Down:节点 nodeE。现已确定 nodeA 和 nodeB 为树节点, 此时
23、的 WordSeg 数据结构如表 5 所列。现构建 nodeA 的另一个子节点, 即 nodeB 的兄弟节点。在最新 WordSeg 中, 已经成为树节点的词或 log_index_dict 为 的单词不予考虑 (即 nodeA, nodeB) , 其他的单词 (nodeC, nodeD, nodeE) 均与 nodeA 求交集, 然后再与 nodeB 求差集, 得到临时 wordSeg (temp WordSeg, 如表 6 所列) , 在该 temp WordSeg 中找到词频最高的词 nodeC, 将其作为树节点, 画树并更新 WordSeg, 结果如表 7所列。表 5 WordSeg
24、数据结构 下载原表 表 6 temp WordSeg 数据结构 下载原表 表 7 WordSeg 数据结构 (更新之后) 下载原表 4.4 模板树的剪枝当父节点超过 k 个子节点时, 将丢弃所有子节点, 使父节点本身成为一个叶子节点, 这样从 root 节点到叶子节点的每条路径均为一个日志模板, 如图 2 中“Interface*changed state to up”等。实验证明 k=10 可以有效保留节点且日志模板完整, 伪代码如图 3 所示。图 3 基于标签识别树提取模板 下载原图5 基于在线模板提取模型5.1 词分类通过对上述两个模型的研究, 发现存在两大问题。(1) 单词分类粒度大:
25、日志句子中的单词简单划分为模板词和参数词, 非此即彼, 没有对单词进行再细一层的划分。(2) 均采用离线批处理的方式, 其不足之处在于:因为日志消息的格式可能会在将来发生改变, 而且还需要观察很长时间才能捕获所有模板, 灵活度不足。因此, Kimura 提出了一种在线模板提取方法8, 可以以增量的方式学习并提取模板。该方法的主要思想是通过计算日志与日志模板的相似度, 使该日志自动快速地将日志消息转换为日志模板。该方法的主要过程是, 系统一开始并没有日志和日志模板, 当新到模板进入系统之后, 该模型可以不断地聚类和更新簇的集合, 即通过自动计算日志消息和日志模板之间的关系进行聚类, 而不使用任何
26、以前的日志知识。将主要思想进行细化:(1) 基于属于日志模板的趋势对每个单词进行分类, 分为只有符号、只有字母、只有符号和字母、只有数字和字母、只有数字或者只有数字和符号 5 类, 表 8列出了单词分类定义的示例。表 8 单词分类 下载原表 (2) 通过将日志模板作为消息簇, 并通过计算消息簇和新增消息之间的日志相似性 (log similarity) 来在线实时聚类新增的消息到相应的模板簇中。5.2 设置单词权重从对日志消息的观察, 诸如“=”或“:”符号可能属于日志模板, 诸如 IP 地址、进程 ID 等可以被认为是参数, 首先对单词分类进行详细的定义, 定义 = i (i=1, 2, ,
27、 5) 作为成为每个类型 i 的日志模板词的权重向量。根据该定义, 的值通常设置为 1 2 3 4 5。5.3 在线日志聚类对于每个新到来的日志消息, 执行在线聚类算法, 使得消息被分配到具有最高相似性的消息簇中, 具体如下。当新增的 syslog 消息进入模型时, 根据消息中不同类型的单词的数量, 该方法将新消息分配到现有的模板集群中或为该新消息创建新的模板集群。该方法的重点在在线学习 syslog 消息模板的词类而非单词本身, 因此属于不同子类型的系统日志消息可以很容易地分配到一个模板集群中。其中, 将消息 X 分配到集群 C 的相似度计算如下:其中, x=x i表示 X 中的属于类 i
28、的单词的数量, 并且 cx=cx, i表示同时属于C 和 X 中出现的类的 i 单词的数量。基本思想是如果 logSimilarity 的最高值大于或等于阈值 E, 就将消息 X 合并到对应 C 中, 否则为 X 创建一个新的模板集群。该模型的伪代码如图 4 所示。图 4 基于词类别在线提取模板 下载原图图 4 中首先提取了新增日志 X 的词分类。然后搜索出 X 与簇集合中具有最高logSimilarity 的消息簇, 如果相似度值大于 E, 则 X 被聚合到最高消息簇中;否则, 为 X 创建一个新的集群。最后得到的消息簇即为日志模板。5.4 参数的选择根据 E 的定义, 如果 E 的取值越大
29、, 便会创建出更多的集群;而 E 的取值越小, 则会使得当前集群 C 包含过多伪模板词, 从而集群的总数量也会减少。通过多次运行算法且根据互联网数据操作团队对提取到的模板进行分析之后, 选取E=0.93 时, 模板是最合理的。6 评估 3 种提取模板模型通过以上 3 种方法模型分析 syslog 并提取模板, 我们认为基于标签识别树提取模型在本文设定的场景中最为稳定。为了验证该结论, 使用互联网公司的实际数据进行验证。由于数据操作中心团队每天都在接触日志信息, 因此他们能够熟练地分析出所给日志信息所代表的网络事件。因此, 基于操作团队提供给我们的分类依据, 可以手动分类消息类型, 并作为评估
30、3 种方法的真实依据。选择了 3 种服务集群下的实例, 即分析了数十亿的系统日志消息, 从中随机收集一份日志样本进行评估, 结果如图 5 所示。图 5 3 种提取模板方法的准确率比较 下载原图对于每种类型的实例, 首先从中随机选择 4 种消息类型, 对于每种消息类型, 随机收集了 500 条日志消息, 即 2000 条数据进行比对。然后操作团队根据每条消息代表的事件手动分类日志消息, 最后我们使用基于标签识别树的方法、基于统计模板的方法和基于在线模板提取的方法分别提取每种消息类型的模板。为了定量比较这 3 种方法的准确性, 采用了基于手动分类结果的 Rand_index 方法。Rand_ind
31、ex 是一个用于评估两种数据聚类方法之间的相似性的方法, 可以将通过手动分类的结果模板与通过上述 3 种方法提取的结果模板作为该评估方法的输入, 通过 Rand_index 来评估每种方法的准确性。具体来说, 重复地从100 条日志中随机选择两个消息 X 和 Y, 并定义 A, B, C, D4 个指标。1) A:X 和 Y 被手动分在同一类中且 X 和 Y 被方法定义为同一个模板;2) B:X 和 Y 被手动分到不同类中且 X 和 Y 被方法定义为不同的模板;3) C:X 和 Y 被手动分到不同类中且 X 和 Y 被方法定义为同一个模板;4) D:X 和 Y 被手动分在同一类中且 X 和 Y 被方法定义为不同的模板。Rand_index 被定义为:图 5 给出了 3 种方法分别提取 4 种消息类型下的 Rand_index 评分。从图中可以看到基于标签识别树提取模板模型的 Rand_index 的平均分为 99.57%, 高于基于统计模板提取模型的 77.92%, 高于基于在线模板提取模型的 57.06%。因此, 基于标签识别树提取模板模型是最为稳定和可靠的提取日志模板方法。结束语本文在不需要领域知识的前提下, 直接且在线地从海量的原始日志中提取日志模板, 为以后从日志模板中提取网络事件进行根因分析以及进行故障的