type
status
date
slug
summary
tags
category
icon
password
1、Beats家族介绍
使用Logstash、Elasticsearch和Kibana已经可以完成数据采集、存储和分析的整个流程的操作。在Beats家族出现之前,数据采集的确是Logstash的工作,然而,随着采集数据的增多,Logstash采集数据显得越来越力不从心。试想,假如有100个节点,每个节点上有10个日志文件需要采集,则需要安装100个Logstash,一共要启动1000个数据管道同时写入Elasticsearch,这样会非常浪费硬件资源,而且Elasticsearch需要启动大量的线程去应对1000个数据管道日志的同时写入,效率十分低下。Beats家族的每一个成员都擅长某个方面的数据采集,并且它们的性能开销非常小,使用Beats家族的成员完成分布式环境中的大规模数据采集对提升大数据处理的效率十分有好处。
由于Beats家族的成员采集到的数据可以直接写入Elasticsearch,一个简单的办法是不使用Logstash直接将Beats家族采集到的数据写入Elasticsearch的预处理节点(预处理节点类似于Logstash的过滤器,它可以将采集到的非结构化数据转化为结构化的字段)还可以先进行数据转换再将其写入索引,最后使用Kibana可视化展示采集到的数据,整个架构如下图所示。
这个架构特别适用于Filebeat自带的模块数据采集,虽然省略了Logstash使数据的处理流程变得简化,但是也存在一些缺点。
- 如果同时写入的Beats节点过多,依然会给Elasticsearch集群带来不小的写入压力。
- 使用预处理节点转换数据没有使用Logstash灵活、方便,数据转换功能相对简单。
可以使用 Filebeat + Filebeat 的架构模式,如下图所示
这种架构的优点是:
- 每个Beats采集数据的吞吐量是不同的,由于Logstash拥有缓冲队列,把Beats的数据流引入Logstash可以起到数据汇聚和数据缓冲的作用,减少数据流对Elasticsearch的冲击力。
- Logstash的input插件功能非常丰富,其相比Beats家族能够采集到更多种类的数据。
- Logstash的数据转换功能比预处理节点的数据转换功能更强大。
- Logstash的output插件相比Beats家族能支持更多类型的数据输出。
2、Filebeat介绍
2.1 Filebeat目录介绍
以Filebeat的安装和使用为代表案例,讲解Beats家族的部分功能和工作原理,Beats家族的其他组件的功能是类似的
要在CentOS 7中安装Filebeat 7.9.1,应先登录Elastic官方网站下载Filebeat 7.9.1的安装包(Linux系统下的安装包),然后使用下面的命令进行解压。
在解压后的文件夹中,下面几个文件重点关注:
- filebeat.yml文件,它是Filebeat运行时的入口,里面包含Filebeat进行数据采集的各项配置,如数据采集的输入和输出配置。
- module文件夹,里面包含Filebeat内置的各种日志采集模块。默认情况下,这些模块都处于禁用状态,使用前需要启用对应的模块才能采集相应的日志。
- data文件夹,里面包含每个日志文件的采集进度数据,每次重启Filebeat时,会读取之前的采集进度数据,并继续采集后面的日志数据。Filebeat采集的数据输出到目的地后会收到相应的确认信息,如果某些数据未得到确认Filebeat会被异常终止,则下次重启Filebeat时,未得到确认的数据会被再次发送,确保每条数据至少能向外传送一次。
2.2 filebeat.yml介绍
使用 Filebeat 采集日志数据前,需要了解 filebeat.yml 的重要配置,然后根据实际情况添加相关的配置内容。
2.2.1 inputs——数据源
Filebeat 支持很多种数据源,参考 https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
常用的 inputs 类型为日志,用于日志文件的采集,旧版 Filebeat 收集日志文件的 inputs 类型为
log
。从 7.16.0 版本开始,log
类型被废弃,被替换为 filestream
类型。log
类型的数据源配置如下:inputstream
类型的数据源配置如下:2.2.2 modules——模块
Filebeat设置模块功能的目的是简化日志的采集和分析过程,例如你想采集和分析MySQL的日志,只需要启用MySQL的模块,给对应的模块配置做少量修改即可完成对MySQL日志的采集。在filebeat.yml中,你需要使用以下代码加载模块的配置。
2.2.3 template——索引模板
索引模板用于设置日志索引的映射结构,如果不进行配置,将使用默认的索引模板创建映射来保存采集的日志数据。例如下面的配置可以将索引映射的主分片数设置为5。
2.2.4 setup——连接地址
通过配置Kibana的连接地址,可以向Kibana中写入定义好的可视化组件、大屏等,用于对采集好的日志做可视化分析。例如:
2.2.5 output——输出
Filebeat支持的输出有很多种,输出到Logstash和Elasticsearch较为常见。如果要将采集的日志数据输出到Elasticsearch,则配置如下。
如果要将采集的日志数据输出到Logstash,则配置如下。
2.2.6 processors——处理器
如果需要对采集到的数据进行简易的转换和处理,则可以定义一些处理器进行数据过滤,它们相当于Logstash的filter,但是功能比Logstash的filter简单。例如下面的配置可给数据流添加一个fields.token字段,内容为1234。
3、Filebeat使用
3.1 Filebeat采集Nginx日志到Elasticsearch中
由于Filebeat已经自带Nginx模块,使用它完成Nginx日志的采集非常简单,本节将演示将Nginx日志经过预处理节点的转换后写入Elasticsearch,你还可以使用相同的方式采集其他模块的日志。
先通过控制台进入Filebeat的安装目录,执行下面的命令启用Nginx模块。
然后查看被启用的模块的列表,确定Nginx模块启用成功。
下面需要配置Nginx日志的路径来完成采集,编辑modules.d文件夹下的nginx.yml文件,代码如下。
在上述配置中,使用var.paths分别指定了access日志和error日志的路径,可以有多个路径。由于ingress_controller日志是给kubernetes使用的,因此在配置中设置成了禁用。
然后编辑filebeat.yml文件,在配置中需要根据实际情况修改Elasticsearch和Kibana的IP地址和端口号,代码如下。
上述配置一开始直接启用了对modules的配置文件的扫描,用于加载Nginx模块的配置。随后配置了索引的模板,Kibana和Elasticsearch的地址,以及各个处理器列表。通过执行以下命令,向Elasticsearch和Kibana中导入日志索引映射和可视化分析相关的资源。
执行完该命令后,可以在Kibana中看到一个新的索引映射filebeat-7.9.1-{date}-000001已经建立好,date是当前日期,该索引映射将用于保存即将采集的日志数据。还可以在Kibana中看到新增了大量的Dashboard用于可视化展示,里面包含Nginx日志可视化分析的大屏。
下面启动Filebeat,开始采集Nginx的日志数据。
运行上述代码后,可以看到大量的日志数据被写入新建的索引,打开Dashboard的Nginx可视化页面,可以改变时间范围筛选日志展示的时间区间,该页面还展示了access日志和error日志的详细列表,效果如图所示。
3.2 Filebeat采集Java日志到Logstash中
在实际项目中,需要进行分析的日志可能并不是Filebeat的现有模块能够直接处理的。对于这种情况,可以选择将日志先采集到Logstash中,使用Grok插件来把日志文本解析为结构化的字段
假如 Java 程序的 log4j2.xml 的日志配置格式如下:
产生的 Java 日志的样例数据如下:
要使用Filebeat采集该文本数据到Logstash中,应对filebeat.yml进行如下配置。
首先配置了一个类型为log的inputs并设置好 Java 日志文件的路径,因为 Java 错误日志中同一个错误会产生多行的异常日志堆栈,这里使用 multiline 把属于同一个错误的多行日志汇总到一起上报。
如果使用旧版本的 Filebeat,inputs.type 为 log 类型的,使用以下配置收集多行日志如果你的 Java 多行日志格式较为复杂,参考https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
然后将output设置为Logstash的监听地址,最后添加了一个处理器add_id。该处理器会给每条数据生成一个唯一的id,该id保存在@metadata._id字段中,可用于去除Filebeat产生的重复数据。
为了使用Grok插件将system.log日志解析为结构化的字段,将采用以下Grok模式处理日志消息,需注意观察每个字段使用的匹配模式以及对特殊字符(例如方括号、分号)的处理方式。下面是针对以上 Java 日志的 Grok 表达式。
使用该模式解析日志后的字段结构如下,可以在Grok调试器中测试解析效果。
再创建一个Logstash的配置文件 spring-boot-filebeat.conf,它启动后会在5044端口监听Filebeat的输入,并接收采集到的日志文本,代码如下。
可以看到,在filter部分设置了Grok模式用于解析日志,在写入索引时,如果字段@metadata._id存在,则将其设置为索引的主键,这样做就完成了对Filebeat中产生的重复数据的去重,最后将索引的名称设置为myfilebeat-{版本号}-{日期}的格式。
下面先启动Logstash以准备接收采集的日志数据。
然后启动Filebeat,开始采集日志。
启动后,可看到日志数据已被采集到索引
myfilebeat-7.9.1-{当前日期}
中。- Author:mcbilla
- URL:http://mcbilla.com/article/e21162db-d9f6-45cf-83b7-1aba2662724c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!