Drain3改进的日志解析方法+代码

news2024/9/22 19:19:44

这本项目继承于https://github.com/logpai/Drain3
在此项目的基础上进行了改进,目前代码在PR阶段,感兴趣的可以从PR上拉取:

前言:

本项目继承于https://github.com/logpai/Drain3
在此项目的基础上进行了改进,目前代码在PR阶段,感兴趣的可以从PR上拉取:
在这里插入图片描述
更多信息可以进入该开源项目了解。
下面直接就现在代码成果层面介绍该算法的原理和使用方式。

一、算法介绍

日志记录了系统运行时的信息,已被服务提供者和用户广泛应用于Web服务管理中。
一个典型的基于日志分析的 Web 服务管理过程是首先解析原始日志消息,因为它们的格式是非结构化的;然后应用数据挖掘模型提取关键系统行为信息,辅助Web服务管理。
现有的日志解析方法大多侧重于日志的离线、批处理。然而,随着日志量的迅速增加,离线日志解析方法的模型训练(即在日志收集后使用所有现有日志)变得非常耗时。
针对这个问题,我们提出了一种在线日志解析方法,及时地解析日志。

日志分析的用处:

1、数据分析人员大多数数据挖掘模型都需要结构化输入(例如,事件列表或矩阵)。但是,原始日志消息通常是非结构化的,因为允许开发人员在源代码中编写自由文本日志消息。因此,日志分析的第一步是日志解析,将非结构化日志消息转换为结构化事件。
2、传统上,日志解析严重依赖于正则表达式 ,这些正则表达式由开发人员手动设计和维护。但是,这种手动方式不适用于现代服务生成的日志,原因有以下三个。
(1)首先,日志量在快速增长,这使得手动方法望而却步。
(2)其次,随着开源平台(例如 Github)和 Web 服务变得流行,一个系统通常由全球数百名开发人员编写的组件组成 [3]。因此,负责正则表达式的人可能不知道最初的日志记录目的,这使得手动管理更加困难。
(3)第三,现代系统中的日志语句更新频繁(例如,每月有数百条新的日志语句)。为了维护正确的正则表达式集,开发人员需要定期检查所有的日志记录语句,既繁琐又容易出错。
我们提出的方法不需要源代码或原始日志消息以外的任何信息。可以自动从原始日志消息中提取日志模板,并将它们拆分为不相交的日志组。它采用固定深度的解析树来指导日志组搜索过程,有效地避免了构建非常深和不平衡的树。达成日志的更好的聚类效果。
3、在日志解析树的构建过程中,起初的设计着基于一些固定的规则来划分树的分支。例如按照日志的长度数值,在向下比较这个分支下的日志模板事件的相似度,且计算日志事件相似度的公式设计的也比较机械,在日志事件的解析聚类中严重受到影响,使得事件的聚类不够紧密。明明两个日志出自同一事件触发引起,但是因为长度的原因而别分成两个事件。我们的方法中设计更加合适规则,来增强事件解析树的聚类能力。

二、数据说明

在这里插入图片描述
在这里插入图片描述
12月10号到1月7号的,655147条ssh服务日志信息,来源IBM Cloud的数据中心的网络基础设施中的事件。IBM Cloud基于位于不同地区和大陆的许多数据中心。在每个数据中心(DC),数千个网络设备都会产生大量的syslog事件。

三、算法内容

一种基于固定深度树的日志解析方法,简单点你可以认为成一种使用分类树的方式给日志文本聚类的过程。当新的原始日志消息到达时,算法会根据领域知识通过简单的正则表达式对其进行预处理。然后我们按照编码在树内部节点中的特殊设计规则搜索日志组(即树的叶节点)。如果找到合适的日志组,则日志消息将与存储在该日志组中的日志事件匹配。否则,将根据日志消息创建一个新的日志组。下面,我们首先介绍固定深度树(即解析树)的结构。和算法流程。

整体树状结构

当原始日志消息到达时,在线日志解析器需要为其搜索最合适的日志组,或者创建一个新的日志组。在这个过程中,一个简单的解决方案是将原始日志消息与存储在每个日志组中的日志事件一一进行比较。但是,这种解决方案非常慢,因为日志组的数量在解析中迅速增加。为了加速这个过程,我们设计了一个固定深度的解析树来指导日志组搜索,它有效地限制了原始日志消息需要比较的日志组的数量。
解析树如图所示。根节点位于解析树的顶层;底层包含叶节点;树中的其他节点是内部节点。
根节点和内部节点编码专门设计的规则来指导搜索过程。它们不包含任何日志组。解析树中的每条路径都以一个叶子节点结束,该叶子节点存储了一个日志组列表,为了简单起见,我们在这里只绘制一个叶子节点。每个日志组有两部分:日志事件和日志 ID。日志事件是最能描述该组中的日志消息的模板,它由日志消息的常量部分组成。 Log IDs 记录了该组中日志消息的 ID。解析树的一种特殊设计是所有叶节点的深度相同,并且由预定义的参数深度固定。例如,图中叶子节点的深度固定为 3。该参数限制了搜索过程中访问的节点数,从而大大提高了其效率。此外,为了避免树分支爆炸,我们使用了一个参数 maxChild,它限制了节点的最大子节点数。下面,为了清楚起见,我们将第 n 层节点定义为深度为 n 的节点。此外,除非另有说明,我们以图中的解析树为例进行说明。

在这里插入图片描述

程序中文本形式打印树结构示例:
Prefix Tree:
<root>
	<reverse>
		"mapping" (cluster_count=1)
			ID=1: size=18909: reverse mapping checking getaddrinfo for <:*:> [<:IP:>] failed - POSSIBLE BREAK-IN ATTEMPT!
	<Invalid>
		"user" (cluster_count=1)
			ID=2: size=14594: Invalid user <:*:> <:*:> from <:IP:>
	<input>
		"userauth" (cluster_count=1)
			ID=3: size=14594: input userauth request: invalid user <:*:> <:*:> [preauth]
	<pam>
		"unix(sshd:auth):" (cluster_count=2)
			ID=4: size=19852: pam unix(sshd:auth): check pass; user unknown
ID=5:size=155057:pamunix(sshd:auth):logname=uid=<:NUM:>euid=<:NUM:>
"unix(sshd:session):" (cluster_count=1)
			ID=17: size=364: pam unix(sshd:session): session <:*:> for user <:*:> <:*:> <:*:>
...

领域知识预处理(步骤一)

对文本信息中一些明现可以看出来是模板中的变量的部分进行预处理可以提高解析精度。因此,在使用解析树之前,我们会在原始日志消息到达时对其进行预处理。具体来说,用户提供基于领域知识的简单正则表达式,这些表达式代表常用变量,例如IP地址和块ID。例如,消息

request 0xefef23 from 127.0.0.1 handled in 23ms

可以被屏蔽为

request from <ip> handled in <num> ms 

此步骤中使用的正则表达式通常非常简单,因为它们用于匹配标记而不是日志消息。此外,一个数据集通常只需要几个这样的正则表达式。大部分日志消息通常是识别诸如十进制数、十六进制数、ip、电子邮件地址等结构,并使用通配符替换这些结构的过程。
如图是ssh数据集中,预处理中使用的正则匹配模型。
在这里插入图片描述
图示的高亮区域的日志,经过预处理后变成:
在这里插入图片描述

Connection closed by <:IP:> [preauth]

经过预处理的日志信息,可以提高解析树的聚合能力。

按日志第一个词搜索(步骤二)

从带有预处理日志消息的解析树的根节点开始。解析树中的第 1 层节点表示日志组,其日志消息具有不同的日志消息首单词。在此步骤中,Drain 根据预处理后的日志消息的日志消息首单词选择到第 1 层节点的路径。例如,对于日志消息“pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=173.234.31.186 ”,Drain 遍历到图中的内部节点pam。这是基于具有相同日志事件的日志消息可能具有相同的日志消息首单词的假设。因为虽然日志文本信息是非结构的,但是基于其固定的使用场景,一般首字母都是大家形成了一般统一认识了的,(比如web应用系统的日志一般开头是info、error、warring等)可以通过简化的后处理来处理。
在这里插入图片描述

按接下来的标记词搜索(步骤三)

在此步骤中,从步骤 2 中搜索到的第 1 层节点遍历到叶节点。此步骤基于日志消息接下来词也可能是常用词的假设(一般前几个词的描述模式都是一定的)。具体来说,通过日志消息开始位置的标记来选择下一个内部节点。例如,对于日志消息“pam unix(sshd:auth): check pass; user unknown”,从第一层节点“pam ”遍历到第二层节点“unix(sshd:auth)”,因为日志消息的第一个位置的令牌是“pam ” ,然后会遍历到与内部节点“unix(sshd:auth)”链接的叶子节点,然后进行第 4 步。在实践中,可以考虑更多具有更大深度设置。请注意,如果深度为 2,则仅考虑步骤 2 使用的第一层。
在某些情况下,日志消息可能以参数开头,例如“120 bytes received”。这些类型的日志消息可能导致解析树中的分支爆炸,因为每个参数(例如,120)都将被编码在一个内部节点中。为了避免分支爆炸,我们在这一步只考虑不包含数字的标记。如果令牌包含数字,它将匹配一个特殊的内部节点“<>”。例如,对于上面的日志消息,Drain 将遍历内部节点“<>”而不是“120”。
此外,我们还定义了一个参数 maxChild,它限制了节点的最大子节点数。如果一个节点已经有 maxChild 子节点,则任何不匹配的标记都将匹配其所有子节点中的特殊内部节点“<*>”。

在这里插入图片描述

按日志相似度匹配日志簇(步骤四)

在这一步之前,已经遍历到一个叶子节点,其中包含一个日志组列表。这些日志组中的日志消息符合路径上内部节点中编码的规则。例如,图中的日志组具有日志事件“pam unix(sshd:auth): check pass; user unknown”,其中首单词“pam”,和第二个特征词”unix(sshd:auth)“。对应了两个节点。
在此步骤中,Drain 从日志组列表中选择最合适的日志簇。我们计算每个日志簇的日志消息模板和日志事件之间的相似度, 相似度定义如下:
在这里插入图片描述
杰卡德系数,英文叫做 Jaccard index, 又称为 Jaccard 相似系数,用于比较有限样本集之间的相似性与差异性。Jaccard 系数值越大,样本相似度越高。 实际上它的计算方式非常简单,就是两个样本的交集除以并集得到的数值,当两个样本完全一致时,结果为 1,当两个样本完全不同时,结果为 0。 算法非常简单,就是交集除以并集。

其中 seq1 和 seq2 分别代表日志模板和日志事件
在找到具有最大 simSeq 的日志组后,我们将其与预先定义的相似度阈值 st 进行比较。如果 simSeq ≥ st,则 Drain 将该组作为最合适的日志组返回。否则,Drain 会返回一个标志(例如 Python 中的 None)以指示没有合适的日志组。

更新解析树(步骤五)

如果第 4 步返回了合适的日志组,会将当前日志消息的日志 ID 添加到返回的日志组中的日志 ID 中。此外,返回的日志组中的日志事件将被更新。具体来说,会扫描日志消息和日志事件相同位置,以日志模板和日志信息中较长的句子作为新的日志模板,同时比较新模板比旧模板多出来信息部分的位置,和相同信息的位置(也就是新模板和就模板差异的位置)。我们在日志模板中通过通配符(即 )更新该差异位置中的标记。并将模板簇的size加一。
例如:
起始,模板为:pam unix(sshd:auth): authentication failure; logname= uid=<:NUM:> euid=<:NUM:> tty=ssh ruser= <:
:>
在一次更新解析树的过程中匹配到了这条日志信息:pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= r host=173.234.31.186
则新的模板跟新为:pam unix(sshd:auth): authentication failure; logname= uid=<:NUM:> euid=<:NUM:> tty=ssh ruser= <::> <::>

如果 Drain 找不到合适的日志组,它会根据当前的日志消息创建一个新的日志组,其中 ID 仅包含日志消息的 ID,而 日志模板正是该日志消息。然后,将使用新的日志组更新解析树。

四、输出结果

在65万条云服务器的日志信息中解析出29条日志模板。
模板之间互相独立,没有交叉,效果显著。
在这里插入图片描述

关于为改进前的Drain的使用方法资料可以查看我这边博客:

事件解析树Drain3的使用方法和解释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【nv12 格式转换】不同图像数据格式之间转换代码实操

文章目录1 问题先行2 nv12介绍2.1 YUV格式2.2 NV12排布3 不同数据格式之间转换实操4 参考链接1 问题先行 nv12是什么格式&#xff1f;和常见的rgb/bgr有什么关系吗&#xff1f;他们之间能互相转换吗&#xff1f;如何读取一张图片&#xff0c;然后把图片转换成nv12格式&#xf…

liunx Reids哨兵模式+1主三从部署6.2.x

1.下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz2.解压 tar xzf redis-6.2.6.tar.gz 3.安装redis cd redis-6.2.6make && make install redis安装异常 安装gcc yum install gcc 检查gcc环境是否安装好rpm -qa|grep gcc 最后在安装redis m…

情人节适合送礼的数码好物有哪些?心意满满的数码好物清单

2023的情人节就快到了&#xff0c;各大数码品牌都已经摩拳擦掌。那么&#xff0c;情人节适合送礼的数码好物有哪些&#xff1f;下面&#xff0c;我来给大家推荐几款心意满满的数码好物&#xff0c;一起来看看吧。 一、蓝牙耳机 推荐产品&#xff1a;南卡小音舱 推荐理由&…

u盘为什么被写保护?u盘数据写保护如何恢复

u盘作为目前主流的数据存储辅助工具&#xff0c;能够存放各种重要数据。虽然u盘体积小巧使用方便&#xff0c;但是使用环节中也会存在各类问题&#xff0c;例如提示u盘写保护的情况。那么出现这种情况的原因是什么&#xff0c;如何解决u盘写保护问题以及写保护的u盘如何恢复数据…

Spring Cloud Gateway断言及过滤器使用

目录 1. 引入Spring Cloud Gateway 2. 核心概念 3. 工作原理 4. 配置路由断言工厂和网关过滤器工厂 5. 路由断言工厂 ​5.1 断言某个时间之后 5.2 断言某个时间之前 5.3 断言某个时间之间 5.4 根据cookie值断言 5.5 根据请求的标头断言 5.6 根据主机名来断言 5.7 根…

Java集合常见面试题(五)

Map 接口 ConcurrentHashMap 的实现原理 JDK 1.7 JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成&#xff0c;即ConcurrentHashMap 把哈希桶切分成小数组&#xff08;Segment &#xff09;&#xff0c;每个小数组有 n 个 HashEntry 组成。 其…

贴息贷款政策下,高校建立大数据实验室新思路

高校实验室建设总目标是搭建一站式教学服务平台&#xff0c;一站式教学服务平台概念是在深刻理解高校学科建设及存在的若干问题上提出。围绕着学科建设的各个方面&#xff0c;从专业开设、课程设置、师资培养、教学资源、实验环境、学生实训实习及就业创业等环节&#xff0c;提…

Hive UDF开发

Hive中&#xff0c;除了提供丰富的内置函数&#xff08;见Hive函数大全–完整版(二)&#xff09;之外&#xff0c;还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式&#xff0c;一个是继承org.apache.hadoop.hive.ql.exec.UDF&#xff0c;另一个是继承or…

windows系统下安装伪分布式Hadoop3.x

1.下载 1.1下载Hadoop3.1.3 官网地址&#xff1a;https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/ 选择hadoop-3.1.3.tar.gz 1.2下载工具集winutils 由于Hadoop不直接支持Windows系统&#xff0c;因此需要使用工具集winutils进行支持。 下载网址&#xff1a;…

can‘t be used as a mixin because it extends a class other than ‘Object‘.

程序员如果敲一会就停半天&#xff0c;抱着一杯茶&#xff0c;表情拧巴&#xff0c;那才是在编程 Flutter 项目开发指导 从基础入门到精通使用目录 前言 - 基础关键字 class&#xff1a;声明一个类&#xff0c;提供具体的成员变量和方法实现。abstract class&#xff1a;声明一…

27.日志技术、XML

目录 一.日志技术 1.1 什么是日志 1.2 目前记录日志的方案 1.3 日志技术的优势 1.4 日志技术体系 1.5 Logback框架 1.5.1 下载地址 1.5.2 模块组成 1.5.3 Logback的使用 二.XML 2.1 XML概述 2.2 XML的特点 2.3 XML文件的使用场景 2.4 XMl文件的创建 2.5 XML的语法…

江瀚新材登陆上交所主板:募资约24亿元,甘书官父子为实际控制人

1月31日&#xff0c;湖北江瀚新材料股份有限公司&#xff08;下称“江瀚新材”&#xff0c;SH:603281&#xff09;在上海证券交易所主板上市。本次上市&#xff0c;江瀚新材公开发行股票66,666,667股&#xff0c;发行价格为35.59元/股&#xff0c;发行市盈率为14.80倍。 按发行…

更高性能表现、更低资源占用,高精度计算数据类型 DecimalV3 揭秘

数值运算是数据库中十分常见的需求&#xff0c;例如计算数量、重量、价格等&#xff0c;为了适应多样化运算场景&#xff0c;数据库系统通常支持精准的数字类型和近似的数字类型&#xff0c;当我们需要精确地表示小数并计算小数时&#xff0c;通常会考虑使用 Decimal 数据类型。…

低代码编程核心技术概念

从技术概念来讲&#xff0c;低代码编程跟通用编程是完全一致的。要利用好低代码编程工具&#xff0c;至少要掌握下面的技术概念。低代码编程核心技术概念一、数据结构这里的数据结构&#xff0c;指一般意义上的数据表和数据字段。 类似于数据库中的表及字段的概念&#xff0c;也…

蓝桥杯2022 A组 python

蓝桥杯2022 A组 python A组相对于B组就五道题不一样 第一题&#xff1a;裁纸刀 就先把四个边剪一下&#xff0c;然后先行后列&#xff0c;蛮简单的 # 20行 横着19刀&#xff0c;竖着21*20 print(1921*204)第三题&#xff1a;质因数个数 这题我感觉就是跟一个约数个数的模板一…

【python】Twisted网络编程

Twisted什么是Twisted&#xff1f;为什么使用twisted&#xff1f;Twisted 写TCP通信基本实例- TCP服务端- TCP客户端Twisted的Deferred机制Why Deferred?Deferred TCP-ECHO客户端实现- TCP client为例&#xff0c;什么是Twisted&#xff1f; Twisted是一种非阻塞的网络服务器…

useEffect 依赖项为对象或数组时,引发不断重渲染问题的原因及解法

转载自 https://www.izhaoo.com/2021/11/01/useEffect-object-dependent/背景今天封了个轮子&#xff0c;对组件传入参数生成对应的动画实例&#xff0c;当入参变化时重新渲染新实例。自然而然想到的就是 useEffect 监听 props 依赖了&#xff0c;如&#xff1a;useEffect(() &…

ESD器件(TVS)选型考虑

参考&#xff1a;TOSHIBA《Basics of ESD Protection (TVS) Diodes》①VRWM: Working peak reverse voltage工作峰值反向电压&#xff1a;ESD保护二极管显示非常高的阻抗。高于这个电压&#xff0c;会通过指定大小漏电流。设计的时候&#xff0c;信号的最大出现电压要在这个电压…

Java基础漏洞(六)

巩固Java基础&#xff0c;基于韩顺平老师的课程&#xff0c;Java的封装、继承、多态、super()、this()、重载与重写的区别......&#xff0c;下面我们一点点来巩固练习。 &#xff08;1&#xff09;继承 继承细节1&#xff1a;子类无法继承父类的私有 图1 我们定义一个父类f…

Ansys Zemax | 利用 TrueFreeForm 面进行网格自由曲面的优化

在这篇文章中&#xff0c;我们将演示如何使用 OpticStudio 的 TrueFreeForm 面&#xff0c;设计AR/VR设备中的人眼追迹系统&#xff08;eye-tracking subsystem&#xff09;&#xff0c;这个系统通常位于装置的楔形透镜结构中。此外&#xff0c;为了完成子孔径&#xff08;sub-…