Filebeat包含两个主要组件:input和harvester。这些组件一起工作来追踪文件并将事件数据发送到您指定的输出。
harvester
harvester负责读取单个文件的内容。
harvester逐行读取每个文件,然后将内容发送到output。
每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着在harvester运行时文件描述符保持打开状态。如果在收集文件时将其删除或重命名,Filebeat将继续读取该文件。这样做的副作用是磁盘上的空间将保留到harvester关闭为止。
关闭harvester具有以下后果:
- 关闭文件处理程序,如果在harvester仍在读取文件时删除了文件,则释放了基础资源。
- 只有在
scan_frequency
经过之后,才会再次开始文件的收集。 - 如果在harvester关闭时移动或删除文件,则文件的读取将不会继续。
input
input负责管理harvest并查找所有可读取的资源。
如果输入类型为log
,则输入将查找驱动器上与已定义的全局路径匹配的所有文件,并为每个文件启动harvest。每个输入都在其自己的Go协程中运行。
Filebeat当前支持多种input
类型。每个输入类型可以定义多次。
Filebeat如何保持文件状态?
Filebeat保留每个文件的状态,并经常将状态刷新到注册表文件中的磁盘。该状态用于记住harvester正在读取的最后一个偏移量,并确保发送所有日志行。如果无法到达output(例如Elasticsearch或Logstash),则Filebeat会跟踪发送的最后几行,并在输出再次可用时继续读取文件。在Filebeat运行时,状态信息也将保存在内存中以供每个输入使用。重新启动Filebeat时,将使用注册表文件中的数据来重建状态,并且Filebeat会在最后一个已知位置继续每个harvester。
对于每个输入,Filebeat会保持找到的每个文件的状态。由于可以重命名或移动文件,因此文件名和路径不足以标识文件。对于每个文件,Filebeat都存储唯一的标识符以检测文件是否以前被获取过。
Filebeat如何确保至少一次传递?
Filebeat保证事件将至少一次传递到配置的输出,并且不会丢失数据。Filebeat之所以能够实现此行为,是因为它在注册表文件中存储了每个事件的传递状态。
在定义的输出被阻止并且尚未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认它已接收到事件为止。
如果Filebeat在发送事件的过程中关闭,则它不会在关闭之前等待输出确认所有事件。除了Filebeat关闭前没有确认的事件,任何被发送到输出的事件会在Filebeat重启时再次发送。这样可以确保每个事件至少发送一次,但是最终可能会将重复的事件发送到输出。您可以通过设置shutdown_timeout
选项将Filebeat配置为在关闭之前等待特定的时间。
Filebeat的至少一次传送保证存在局限性,涉及日志轮换和旧文件的删除。如果将日志文件写入磁盘并且旋转速度比Filebeat可以处理的速度快,或者如果在输出不可用时删除了文件,则数据可能会丢失。