开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈
前言
Filebeat是一款使用GO语言开发的轻量级日志采集工具,能够对指定的目录或者文件进行监视,并读取日志内容。
例如将Filebeat作为Agent安装到k8s集群的每一个Node节点,那么由于Node节点上的每一个Docker容器标准输出的日志都会以Json文件的方式存储到宿主机的本地磁盘上,所以可以通过配置Filebeat的监视目录,采集该节点上的程序的标准输出日志,采集的日志后续可以对接Redis,Kafka等从而进行进一步处理。
本篇文章将对Filebeat的背景,结构和工作原理进行简析。
Filebeat版本:7.2.1
Filebeat文档版本:7.2
正文
一. Filebeat背景
早期ELK架构体系中,日志的的采集由Logstash完成,但是因为Logstash运行于JVM上,对处理器,内存等资源需求大,所以Logstash日志采集的这部分功能被拆出来并用GO语言进行了实现,也就出现了Filebeat。
Filebeat属于Beats系列,Beats系列包含的采集器如下所示。

Filebeat就是Beats系列中用于日志采集的轻量采集器。
二. Filebeat结构
Filebeat的工作示意图如下所示。

由上图可知,Filebeat中最重要的两个组件是:Input和Harvester。
1. Harvester
关于Harvester,说明如下。
- 一个Harvester负责逐行读取单个文件内容,并将内容发送到Output;
- 每个文件对应一个Harvester;
- Harvester负责打开和关闭文件,Harvester运行时文件描述符会保持打开状态;
- Harvester运行时如果文件被删除或者重命名,该文件还是会继续被读取;
- Harvester运行时,文件如果被删除,磁盘上文件占用的空间还是会被保留,直到Harvester关闭;
- 通常情况下,Harvester会保持运行(即保持一个文件的打开状态),除非文件被Harvester读取最后一行的时间距离当前达到close_inactive,此时Harvester会结束运行(并关闭文件描述符)。
当A进程打开某个文件时,A进程就持有了该文件的文件描述符,此时即使文件被删除,该文件还是存在于磁盘上,只不过该文件只对A进程可见,A进程可以继续对文件进行读取和写入。
总结Harvester的作用就是:逐行读取文件并输出内容到Output。
2. Input
关于Input,说明如下。
- Input负责管理Harvester;
- Input负责发现可以读取的文件;
- 可以有多个Input;
- 每个Input都会根据配置的文件路径来发现文件,并为每个文件运行一个Harvester;
- 每个Input都在一个Goroutine协程中运行。
如下的配置是一个简单的Input配置。
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
- type: log
paths:
- /var/path/*.log
- /tmp/log/*.log
三. Filebeat如何记录文件状态
Filebeat文件状态记录策略如下。
- Filebeat将每个文件状态记录在磁盘上的registry注册表文件中;
- 文件状态用于记录Harvester最近读取到的文件的offset;
- 如果Output不可用,那么Filebeat会跟踪文件发送的最后一行,并在Output再次可用时继续读取文件;
- registry注册表文件用于Filebeat重启时重建文件状态;
- Filebeat会通过每个文件的唯一标识符来关联文件状态,而不是文件名或文件路径,因为文件名和文件路径会被改变。
总结Filebeat如何保存文件状态就是:将文件状态记录在磁盘的registry注册表文件中并通过文件的唯一标识符进行关联。
当registry文件过大时,可以通过如下两项配置来减少registry文件大小。
- clean_removed
- clean_inactive
四. Filebeat关闭可能会导致重复内容发送
借助于registry注册表文件记录的文件状态,Filebeat对于读取到的文件内容,能够确保至少一次发送到Output。如果Output不可用,Filebeat会持续重试,直到Output可用为止。
当关闭Filebeat时,默认情况下Filebeat会直接关闭,而不会等待所有正在发送给Output的内容事件被成功发送,这将导致这部分内容事件就算发送成功也不会被Filebeat确认(registry文件不会被更新), 此时如果Filebeat又重新启动,那么之前未确认的内容事件会被重新发送给Output,造成重复发送的现象。
可以通过配置shutdown_timeout让Filebeat在关闭前等待特定的时间。
总结
Filebeat是一款使用GO语言开发的轻量级日志采集工具,通常作为Agent安装到主机上,能够对指定的目录或者文件进行监视,并读取日志内容。
Filebeat中最重要的两个组件是:Input和Harvester。Input负责管理Harvester,而Harvester负责读取日志文件。
Filebeat会记录每个日志文件最近读取到的位置,并且通过文件唯一表示符进行关联。
Filebeat能够确保日志文件内容至少一次被发送,但Filebeat被关闭可能会导致日志内容被重复发送。
大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情