Filebeat简介
一 背景介绍
目前比较主流的日志采集系统有ELK(ES+Logstash+Kibana),EFK(ES+Fluentd+Kibana)等。由于Logstash出现较早,大多数日志文件搜集采用了Logstash。但由于Logstash是JRuby实现的,性能开销较大,因此我们的日志搜集采用的Filebeat来减少性能开销。
二 Beats简介
Beats是Elastic.co从packetbeat发展出来的一个集合了多种单一用途数据采集器的数据采集平台,其中包括
1. Filebeat:用于转发和汇总日志与文件;
2. Metricbeat:用于从系统和服务手机指标。您可以获取系统级的CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据,完全零依赖。
3. Packetbeat:用于深挖网上线传输的数据并实时解析,完全被动,零延迟开销,不妨碍基础架构
4. Winlogbeat:监控基于Windows的基础架构上发生的事件,
5. Auditbeat:收集Linux审计框架数据并监视文件的完整性。
6. Heartbeat:通过主动探测监控服务的可用性。
以上所有的采集器都可以将数据发送到Elasticsearch或者是发送到Logstash过滤后再发送到Elasticsearch,最后展示在Kibana。除此之外,从中抽象出来的libbeat提供了统一的数据发送方法,输入配置解析,日志记录框架等功能。所有的beat工具在配置上 除了input,在output、filter、shipper、logging、run-options 上的配置规则都是完全一致的。
三 Filebeat简介
logstash-forwarder的源码改造出来的,是logstash-forwarder的升级版本,最新版本为6.1.0,且在持续更新,Beat社区非常活跃。
1.架构图
2.主要组件
Filebeat由两个主要
组件组成: prospector 和 harvester。 这些组件一起工作来尾随文件并将事件数据发送到你指定的输出。
prospector负责管理harvesters并找到所有的读取源。目前有几种类型:log(日志文件),stdin(标准输入),Redis,UDP和Docker,当配置日志类型时, prospector会查找驱动器上与所定义的全局路径匹配的所有文件,并为每个文件启动一个harvester。 每个prospector都在自己的Go例程中运行。
harvester负责读取单个文件的内容。 harvester逐行读取每个文件,并将内容发送到输出。harvester负责打开和关闭文件,这意味着在harvesters运行时文件要保持打开状态。如果在收获文件时删除或重命名文件,Filebeat将继续读取文件。这有副作用,在harvester关闭之前,磁盘上的空间被保留。默认情况下,Filebeat保持文件打开,直到达到close_inactive的设置(close_inactive默认为5分钟,即5分钟之内,没有最新的日志信息产生则关闭文件句柄)。
关闭harvester有以下情况:
- 如果在harvester还在读取文件时文件被删除,那么文件处理程序关闭,释放基础资源。
- 只有在scan_frequency过后,文件的采集才会重新开始。(scan_frequency参数默认为10秒,每隔10秒prospector检查目录中日志文件的变化情况)
- 如果在harvester关闭的情况下移动或移除文件,则不会继续收集文件。
3.工作原理
当开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。
4.特性:
Filebeat经常刷新注册表文件中的磁盘状态(保存在安装目录的data目录下,用于记录harvester正在读取的最后偏移量),并可以确保发送所有的日志行,如果接收端无法访问,Filebeat会跟踪发送的最后一行,并在输出再次可用时继续读取文件。如果宕机,重启进程时可以根据注册表文件的数据来重建状态,并继续每个文件上的harvester。对于单个文件会保留唯一标识用以检测文件是否被收集(防止重命名或者移动)。日志过多每天创建大量文件的话,注册表会变的很大,可以使用配置文件中的参数clean_inactive、clean_removed来调整。
Filebeat会将每个event的传递状态存储在注册表中,在确认已经收到事件之前,会一直尝试发送事件。
5.部署Filebeat
DEB:
[root@h1 ~]#
[root@h1 ~]# sudo dpkg -i filebeat-6.1.1-amd64.deb
RPM:
[root@h1 ~]#curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.1-x86_64.rpm
[root@h1 ~]#sudo rpm -vi filebeat-6.1.1-x86_64.rpm
MAC:
[root@h1 ~]#curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.1-darwin-x86_64.tar.gz
[root@h1 ~]#tar xzvf filebeat-6.1.1-darwin-x86_64.tar.gz
Docker:
docker pull docker.elastic.co/beats/filebeat:6.1.1
WIN:
- 下载windows zip文件
- 解压文件到 C:\Program Files.
- 重命名为 Filebeat.
· 打开CMD命令窗口
· 运行以下命令来安装Filebeat作为Windows服务
cd C:\Program Files\Filebeat
C:\Program Files\Filebeat> .\install-service-filebeat.ps1
6.主要配置
Filebeat配置文件使用YAML,具体语法详见
https://www.elastic.co/guide/en/beats/libbeat/current/config-file-format.html
7.经典架构
8.问题
日志写入磁盘的速度超过Filebeat读取日志的速度,或者当日志被删除或者被覆盖的时候可能丢失数据。
filebeat在空载情况(没有日志可采集)下的确不会有大的内存开销,但在有大量的日志需要采集时,filebeat的内存占用是没有固定值的。
Filebeat使用Go自带的encoding/json包是基于反射实现的,性能有一定问题, Go 有多个针对给定结构体做 JSON 序列化 / 反序列化的第三方包,可以使用来降低提高性能。
四 Logstash简介
1. 简介
Logstash是一个完全开源的日志管理工具,可以对日志进行收集、分析,并将其存储供以后开发者统计和查询日志信息。
2. 架构图
Logstash 社区通常习惯用shipper,broker 和 indexer 来描述数据流中不同进程各自的角色。如下图:
3.插件配置
logstash配置文件有2个内容组成,input和output,其实还有2个配置:filter和codec。下图是logstash内部的一个叫做事件处理管道(pipeline) 的核心概念的3大组成部分:
1) input:
生成事件(logstash中的事件是由队列实现的,这个队列由ruby的SizedQueue实现)的数据来源,常见的有file(文件)、syslog(系统日志)、redis(缓存系统)、 lumberjack(lumberjack协议) 。
在每个部分中,也可以指定多个访问方式,例如我想要指定两个日志来源文件,则可以这样写:
input {
file{ path =>"/var/log/messages" type =>"syslog"}
file{ path =>"/var/log/apache/access.log" type=>"apache"}
}
2) filter:修改事件内容,常见的filter有grok(正则过滤器)、mutate、drop、clone、geoip
3) output:展现结果,常见的有elasticsearch(搜索引擎)、file、graphite、statsd
4) codec:可以作为input或output的一部分,主要用来处理日志过程中产生的消息,常见的codec有json、rubydebug
五 Filebeat对比Logstash
见Filebeat对比Logstash的Excel。