【导语】对于海量文本型数据比如日志,如何从中提取日志模式以便更快地从文本中获取关键信息。本文先简单介绍了行业竞品的相关产品形态,然后重点介绍了一种基于机器学习的日志智能聚类解决方案——基于图结构的聚类方法。
Paas和Iaas平台上有很多很复杂的系统,每个云系统里面有很多不同的组件,每个组件之间有各自的日志输出。随着系统和业务的高速发展,各个系统每天产生大量的日志,有可能出现比如系统有潜在异常,但被淹没在海量日志中;新版本上线,系统行为有变化,却无法感知。同时,对于不同用户或开发者自定义打的日志,其格式并不一定相同,且随着时间的变化日志格式愈发多样。
以上问题归根到底,是信息太多太杂不能良好归类,同时记录信息的日志,往往格式多样难以统一规范,这对于AIOps排障是一个是否头疼的问题。如果能够将日志采集并进行聚类模式学习,通过AI算法把海量日志划分为少数的几种模式,这样原来几千万行的日志被归类为几十条,这样就能大大加快日志查看和故障排查的效率。
智能聚类将相似度高的日志聚集在一起, 提取共同的日志pattern,是能带来的直接收益。
日志聚类对于后续的功能比如日志异常检测是非常有帮助的,错误日志的异常检测需要建立在日志聚类的基础上。
以安灯数据集、群开发逻辑层日志为例,左边LogStr是原始日志,右侧signature是聚类之后的形态,针对每一类日志赋予一个标签logEvent*,相同标签的日志即为同一类。
对比竞品某厂的日志服务SLS产品形态较为成熟。SLS提供实时日志智能聚类(LogReduce)功能,采集文本日志时,将相似度高的日志聚集在一起, 提取共同的日志pattern;能够在搜索分析过程中帮助发现 日志的规律与特征 ,提升重要信息发现能力。对于日志的样式无任何限制,只会根据日志相似性,提取出通用Pattern,快速获取日志的整体概览。
功能特点:
基于图结构的日志聚类方法,包括基于文本分词、向量相似度以及最大连通子图等方法,对日志进行聚类并获取特征库;根据特征库中的类别特征对海量日志进行类别标记。
本节先介绍如何构建特征库,再介绍如何在线上和离线进行日志聚类,最后总结说明该方法的优缺点。
如图,构建特征库注意包括三个步骤:日志向量化、确定日志相似关系和构建特征库。
采集原始日志,提取数据字段解析格式,比如时间、特殊字符、IP等。将半结构化、非结构化的原始日志转换成结构化日志
举例,一下两个syslog日志,按列可以结构化为时间戳、日志来源、日志内容等子弹,经过结构化处理之后变为下表的格式
日志序号 | 日志 |
---|---|
syslog1 | 2020-06-30 20:00:00; snmpd[2247]:Connection from UDP:[255.255.2555.255]:62959 |
syslog2 | 2020-06-30 20:00:01; snmpd[2247]:Received SNMP packets from UDP:[127.0.0.1]:58656 |
日志序号 | 时间戳 | 来源 | 日志 |
---|---|---|---|
syslog1 | 2020-06-30 20:00:00 | snmpd | Connection from UDP:[255.255.2555.255]:62959 |
syslog2 | 2020-06-30 20:00:01 | snmpd | Received SNMP packets from UDP:[127.0.0.1]:58656 |
获取所有结构化日志中包含的所有分词。预设规则,删除干扰词,包括但不限于IP地址、端口号、16进制数、url链接等等。将所有分词编号,构建分词库,如下表。
编号 | 分词 |
---|---|
1 | Connection |
2 | from |
3 | packets |
4 | Received |
5 | SNMP |
6 | UDP |
日志序号 | 日志 | 日志向量 |
---|---|---|
syslog1 | Connection from UDP | (1, 2, 6) |
syslog2 | Received SNMP packets from UDP | (4, 5, 3, 2, 6) |
构建最大连通子图,将向量化后的日志映射为图中一个点,计算点之间的相似度;若若两个日志向量相似,则日志向量之间存在一条边。注意,如果多个日志向量化之后的表示完全相同,则可删除重复的日志向量,减少重复的计算量。
如图示例,生成各个类别包含的日志向量集合,日志相似关系图中的每个最大连通子图定义为一个类,每一类包含的日志向量即该最大连通子图包含的点
相似性度量方法:最长公共子序列(注:也可采用余弦相似性等)
设A和B分别为两个日志向量A=(a1, a2, a3, ..., am),B=(b1, b2, ..., bn),LCS(A, B) 为两者的最长公共子序列;
举例说明,给定两个序列s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2},s1和s2的其中一个最长公共子序列是 {3,4,6,7,8}。
若该最长公共子序列的长度与两个日志的长度之比均大于各自的相似度阈值,则认为两者相似,其表达式为:
LCS(A, B) / |A| >= similarity_threshold,
LCS(A, B) / |B| >= similarity_threshold
其中|A|表示A日志向量的长度。
如上图,每个日志类别的特征为该类别包含的所有日志向量的最长公共子序列。举例,第一类label1={A, B, C},则特征w1=LCS(A, B, C)
输入每个日志类别所包含的日志向量集合,输出特征库。
类别 | 单个类集合 | 特征 |
---|---|---|
LABEL1 | J, K, L, N, P | LCS(J, K, L, N, P) |
LABEL2 | A, B, D | LCS(A, B, D) |
LABEL3 | C, H, I | LCS(C, H, I) |
LABEL4 | O, M | LCS(O, M) |
LABEL5 | E, G | LCS(E, G) |
LABEL6 | F | LCS(F) |
聚类应用的几个步骤:
除了最长公共子序列的方法用于判定日志相似关系外,也可以采用诸如余弦相似度的计算方法。
余弦相似度(Cosine Similarity)用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。
因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。两个日志向量A、B的相似度计算公式如下
本文先介绍了日志使用场景,一线运维人员面对海量日志排查问题非常低效。然后介绍了日志聚类可以提供的便捷性,以及以竞品某厂的日志服务的较为成熟的产品形态。最后介绍了一种基于图结构的日志聚类方法。该方法采用了包括基于文本分词、向量相似度以及最大连通子图等技术,对日志进行聚类并获取特征库进而实现对海量日志进行类别标记的功能。关于日志聚类的更多方法将在后续详细介绍。
参考链接
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。