日志分析的模式发现功能实现(1)

2020-05-29 00:00:00 功能 字段 模式 日志 分组

模式发现,几乎已经快成为日志分析产品中标配的机器学习功能。当然各家有各家的实现方式。准备开启一个系列文章,分别介绍几家主要的产品里该功能的做法,以及可行的类似效果的实现方式。当然,肯定不是人家真正的实现方式,毕竟我可不是偷代码的……

作为系列文章的开始,还是要给不清楚这个功能的读者先科普一下这个功能的作用。

大家如果只分析个Nginx日志,是用不着模式发现功能的。但是如果你开始做一个全公司的AIOps平台,接入来自不同部门的应用日志、设备日志、系统日志以后,你会发现什么你再也没时间挨个写正则、配告警了,因为种类太多了——像思科的ASA日志种类大概有三百多种,何况公司通常不会只采购同一型号的设备,而是多家。

但是在进行日常巡检、故障排查的时候,又有必要了解日志的整体状态、有哪些种类、占比多少、趋势如何。所以,我们需要一个特定的功能,能自动进行日志的文本格式分类。这就是『模式发现』功能。有时候,也会按照其主要技术实现,叫做『日志聚类』功能。

---------------------------

好了,现在进入篇的主题,当然从行业老大说起:

Splunk 是从 6.2 版本推出的这个功能,会基于当前搜索语句的结果集做模式探测,根据精度调整,做成不同数量的聚类。然后给每个聚类分组内,提取出一个关键词(个别情况下也有零个或多个的)。也就是通过机器学习的手段,探测你的日志可能有什么模式,其具识别性的关键内容是什么。

这个页面虽然看着是特定的,但是以splunk一切皆命令的理念,页面的内容也是可以直接用 SPL 获取的。这个对应的语句就是:index=_internal | cluster t=0.8 lableonly=true | findkeywords labelfield=cluster_label | sort - percentInputGroup

好了,看起来在splunk里达到这个目的很简单呢!那么转过头来,我们在开源的 ELK 上,能做到么?

我们目前当然在 ES 里是没法做聚类分析什么的了。不过在日志场景下,也不是没有近似的办法。

步:完成山寨版的日志模式分组

其实如何山寨模式分组,Splunk 也有类似 SPL 命令做出了示范。这个命令叫 typelearner

这个命令的大致意思是:把日志里的英文单词、数字、空格等字符都隐藏掉,剩下各种标点符号,就代表一种日志类型。简单的处理方式就是:

# cat cisco.asa.log | \
sed ‘s/^\(.\{128\}\).*/\1/’ | \
sed ‘s/[0-9a-zA-Z]*//g’ | \
sed ‘s/[[:space:]]/_/g’ 

相关文章