《Storm实时数据处理》一2.4 基于规则的日志流分析

2.4 基于规则的日志流分析

任何合理的日志管理系统都需要具备以下特性:
(1)过滤无关紧要的日志信息,无须对这类日志进行统计和排序。这类日志常常包含INFO或DEBUG等级的日志记录(没错,产品系统中也会包含这些信息 )。
(2)深入分析日志记录并提取更多有价值的信息和新的字段。
(3)在保存日志之前增改日志记录。
(4)当收到特定日志记录时发送通知信息。
(5)通过关联日志事件来获取有价值的信息。
(6)应对日志结构和格式的变更。
本节在Bolt中集成了JBoss库和Drools,以便于我们通过声明和清晰的方式,轻松实现上面列举出的这些目标。Drools是一个基于正向推理的规则引擎的开源实现,它可以推断新的值并根据匹配逻辑执行相关逻辑操作。你可以在这个网站上找到Drools项目的更多信息:http://www.jboss.org/drools/。

2.4.1 实战

Step01 使用Eclipse,在storm.cookbook.log包中创建LogRulesBolt类,并继承BaseRichBolt。与LogSpout类一样,LogRulesBolt类会发送一个包含LogEntry实例的值到Topology中。

Step02 在StatelessKnowledgeSession类中添加一个私有成员变量kssession,并在Bolt的prepare方法中对其进行初始化。

该知识会话只初始化了一组syslog日志规则。建议把规则管理的工作交给Drools Guvnor或者类似的软件,然后通过代理来获取有关规则资源。这个主题已经超出了本书的讨论范围,更多信息可以参考以下链接:http://www.jboss.org/drools/drools-guvnor.html。
Step03 在Bolt的execute方法中实现这个逻辑:把Tuple中的LogEntry对象传递到知识会话中。

Step04 接着创建规则资源文件,使用文本编辑器或Eclipse插件就可轻松搞定。可以从更新站点http://download.jboss.org/drools/release/5.5.0.Final/org.drools.updatesite/下载到相关Eclipse插件。规则资源文件应该放置在classpath的根目录下。在src/main/resources下创建Syslog.drl,然后右击该目录,依次选择 “Build Path ”→ “Use as source folder”菜单项,将这个目录添加到Eclipse的构建路径中。
Step05 将以下内容添加到规则资源文件中:

2.4.2 解析

Drools支持两种类型的知识会话,分别是有状态(stateful)会话和无状态(stateless)会话。在这个例子中,我们只需要一个无状态会话就足够了。
在我们使用有状态会话的时候,需要时刻注意其可能导致的性能问题。有状态会话主要是维持工作会话中内存的“事实”(fact),这在有些用例中十分重要。但需要了解的是,Drools所使用的正向推理Rete算法引擎的性能还是会随着知识库中“事实”的增加而呈指数级下降。
知识会话根据已知的一组规则来评估事实。Bolt的prepare方法中定义了这一系列操作,并在该方法中指定了相关规则。在Bolt执行过程中,通过如下调用从Tuple中提取LogEntry并将其传递到知识会话中:

在执行过程中会把知识会话当做一条记录进行处理,而且该记录在每次调用结束时有可能改变。LogEntry对象中包含一个名为filter的控制字段,如果将这个字段设置为true,那么这条日志记录将被丢弃。实现方法是:在规则执行后,发送包含记录的Tuple之前,检查这个字段。

在规则资源文件中,定义了三个规则:
(1)Host Correction
(2)Filter By Type
(3)Extract Fields
这些规则只是为了我们演示一些基本概念而设计的,所以在产品中可能并没有什么用。Host Correction规则会尝试纠正主机名以使其符合要求。该规则会在满足匹配标准时自动将结果显示出来。该规则的when子句将LogEntry实例的sourceHost字段与localhost做匹配操作,当满足条件时触发相关动作。

这个条件子句也会在规则允许的范围内把满足条件的实例赋给局部变量l。then子句是一段传统的 Java 代码(POJO),它会在编译后的运行时添加到当前classpath中。这些规则能让localhost值满足我们的需求。

Filter By Type规则会将所有非syslog类型日志记录的filter字段设置成true。
Extract Fields规则更加有趣。首先,它所包含的salience命令可以确保其在最后才被执行。这样就可以避免它从已过滤的日志中提取字段。借助于正则表达式匹配,该规则可以从日志文件中提取更多的字段和结构。虽说有关正则表达式的内容超出了本书的讨论范围,但有不少总结得很好文档可供我们参考。
考虑到介绍的完整性,我们在这里罗列了一些有助于删选日志记录的正则表达式示例:

匹配日期:((?<=>))\w+\x20\d+
匹配时间:((?<=\d\x20))\d+:\d+:\d+
匹配IP地址:((?<=[,]))(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})
匹配协议:((?<=[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}]\s))+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

可以在维基百科中找到更多有关正则表达式的内容:

http://en.wikipedia.org/wiki/Regular_expression

这些附加字段可以被添加到字段或者标签当中,我们会在稍后的分析、搜索和分组操作中使用这些字段。
Drools中还有一个叫做Drools Fusion的模块,用于支持复杂事件处理(CEP)。CEP常常被视为一个新的企业级方法,这么讲不为过,但实际上就是指让规则引擎能够在与时间相关的情况下进行正常的处理。它可以根据时间来关联事件,然后导出新的知识或触发相关动作。在本节的Bolt实现中就有时序算子的身影。欲了解更多的信息,可以浏览以下链接:

http://www.jboss.org/drools/drools-fusion.html
时间: 2024-12-31 11:39:07

《Storm实时数据处理》一2.4 基于规则的日志流分析的相关文章

《Storm实时数据处理》一导读

前 言 开源已经在许多方面从根本上改变了软件的原有面貌.在很多应用环境中,人们都会争论使用开源带来的好处和坏处,主要体现在支持.风险以及总体拥有成本等方面.开源在某些领域比其他领域流行,比如在研究机构中就比在大型金融服务提供商中应用得多.在某些新兴领域,比如Web服务供应商.内容供应商以及社交网络等,开源软件占据主导地位.其原因是多方面的,其中成本是一个非常大的因素.怎么说呢?如果方案要上升到网络规模,那么一般会应用"大数据"解决方案,以期获得更好的效果.凭借极佳的可用性,这些解决方案

《Storm实时数据处理》一2.6 统计与持久化日志统计信息

2.6 统计与持久化日志统计信息 我们其实可以收集很多日志流的统计信息,但由于本节只是为了展示一些基本概念,因此我们只准备收集和处理单时间序列(每分钟)日志量.虽说如此,但这应该已经足以展示有关的设计和方法了,这些技巧能够帮助你在未来实现其他分析工作. 2.6.1 实战 Step01 下载storm-cassandra contrib项目并将其安装到Maven仓库中: Step02 在storm.cookbook.log包中,创建一个继承自BaseRichBolt的类VolumeCounting

《Storm实时数据处理》一2.1 简介

2.1 简介 本章将会展示一个企业日志存储系统的实现方法,以及一个基于Storm处理系统的搜索分析解决方案.其实日志数据处理已经不再是一个需要解决的问题了,但它依然能够帮助我们加深理解这些新概念.数据流处理在现代企业中是一个主要的架构关注点.但通常情况下,最理想的数据流也只是半结构化的.本章展示了一个企业日志的处理方案,目的是为了让读者学习了解各种重要概念,获得处理各种类型数据的能力.由于日志数据量庞大,因此日志数据也为学术研究提供了极大的便利.对于任何流处理或分析工作来说,其成功的关键都在于深

《Storm实时数据处理》一2.8 创建日志分析面板

2.8 创建日志分析面板 日志分析面板是一个通过图形的方式向用户展示统计信息的Web应用程序.在实现它之前,我们需要先了解一下用户界面设计原则. 区分焦点:只显示必要的内容,根据用户试图得到的东西来创建焦点,而不是让用户因无关内容而分心. 极简主义:从可用性角度考虑,只需要包含必要的图形特性. 响应式处理:这是一种确保显示内容清晰和一致的方法,无论是在PC上还是在平板电脑上进行查看. 基于标准:你不应该使用非标准的技术进行开发,因为这有可能会妨碍在诸如iPad这样的设备上正常访问我们的程序. 本

《Storm实时数据处理》一1.5 创建Storm集群——配置机器

1.5 创建Storm集群--配置机器 本地模式下测试集群对调试和验证集群的基本功能逻辑很有帮助.但是,这并不代表你就能够了解集群在实际环境中运行的状况.此外,只有当系统已经在产品环境中运行时,开发工作才算真正完成.任何开发者都应该重视这一点,并且这也是整个DevOps实践的基础.无论采用什么方法,你都必须能够将代码可靠地部署到产品环境中.本节将展示如何直接通过版本控制创建和配置一个完整的集群.在此之前,需要事先说明一些有关创建和配置集群的基本原则: 我们需要时刻了解服务器的会话状态.在没有严格

《Storm实时数据处理》一1.4 创建“Hello World”Topology

1.4 创建"Hello World"Topology "Hello World" Topology和其他所有的"Hello World"应用程序一样,并没有什么实际用途,其目的在于说明一些基本概念."Hello World" Topology结构将演示如何创建一个包含简单的Spout和Bolt的项目,如何构建项目,并在本地集群模式下运行项目. 1.4.1 实战 Step01 新建一个项目目录,并初始化你的Git代码仓库. S

《Storm实时数据处理》一1.10 将产品部署到集群

1.10 将产品部署到集群 在完成整个开发过程之前,我们需要对集群中的Topology进行功能性测试,然后再将其部署到下个环境中. 1.10.1 实战 Step01 首先需要在主机开发环境中配置Storm客户端,在用户主目录下创建.storm目录.然后在这个目录下新建storm.yaml,内容如下: Step02 在项目根目录下,使用以下命令打包Topology: Step03 这样就会在项目的目标目录下生成一个完整并打包好的JAR文件.这时就可以用storm客户端命令将JAR包部署到集群上:

《Storm实时数据处理》一1.7 获取基本的点击率统计信息

1.7 获取基本的点击率统计信息 统计点击率Topology用于记录基本的网站使用量统计信息,具体来说它会统计以下信息: 访客数量 独立访客数量 特定国家的访客数量 特定城市的访客数量 特定国家中每个城市访客数量的百分比 该系统假定访客总量一定,而且希望服务端的用户标示与客户端的Cookies是相对应的.该Topology通过IP地址和公用IP解析服务获取地理位置信息.统计点击率Topology还将使用Redis存储发送到Topology的点击事件,具体来说就是将其作为一个持久化队列:除此以外还

《Storm实时数据处理》一1.2 搭建开发环境

1.2 搭建开发环境 开发环境涵盖了构建Storm Topology所需的各种工具和系统.虽说本书重点关注的是每个有技术侧重点的Storm交付,但需要指出的是,对于一个软件开发团队来说,无论使用集中式开发环境还是分布式开发环境,都需要更多的工具和流程来保证高效工作,而且不能仅仅局限于本书所讨论的内容.无论是为了将来的开发工作,还是为了实现书中的例子,以下几类工具和流程都是快速搭建开发环境必不可少的: SDK 版本控制 构建环境 系统配置工具 集群配置工具 书中描述的配置和安装方法都基于Ubunt