Filebeat 的工作原理
编辑Filebeat 的工作原理
编辑在本主题中,您将了解 Filebeat 的关键组成部分及其协同工作方式。理解这些概念将有助于您做出明智的决策,从而针对特定用例配置 Filebeat。
Filebeat 包含两个主要组件:输入 和 采集器。这些组件协同工作以跟踪文件并向您指定的输出发送事件数据。
什么是采集器?
编辑采集器负责读取单个文件的内容。采集器逐行读取每个文件,并将内容发送到输出。每个文件都会启动一个采集器。采集器负责打开和关闭文件,这意味着在采集器运行期间文件描述符保持打开状态。如果正在采集的文件被删除或重命名,Filebeat 将继续读取该文件。这有一个副作用,就是您的磁盘空间会被保留,直到采集器关闭。默认情况下,Filebeat 会一直保持文件打开状态,直到达到 close_inactive
。
关闭采集器具有以下后果:
- 文件句柄将被关闭,如果文件在采集器仍在读取文件时被删除,则释放底层资源。
- 只有在经过
scan_frequency
后,才会再次启动对该文件的采集。 - 如果在采集器关闭时文件被移动或删除,则不会继续采集该文件。
要控制何时关闭采集器,请使用 close_*
配置选项。
什么是输入?
编辑输入负责管理采集器并查找所有要读取的来源。
如果输入类型为 log
,则输入会查找驱动器上与定义的 glob 路径匹配的所有文件,并为每个文件启动一个采集器。每个输入都在其自己的 Go 协程中运行。
以下示例配置 Filebeat 以采集与指定的 glob 模式匹配的所有日志文件中的行:
filebeat.inputs: - type: log paths: - /var/log/*.log - /var/path2/*.log
Filebeat 目前支持 多种 input
类型。每种输入类型可以多次定义。 log
输入会检查每个文件,以查看是否需要启动采集器,是否已运行采集器,或者是否可以忽略该文件(参见 ignore_older
)。只有当文件大小自采集器关闭以来发生更改时,才会拾取新行。
Filebeat 如何保持文件的狀態?
编辑Filebeat 保持每个文件的狀態,并经常将状态刷新到注册表文件中的磁盘。该状态用于记住采集器上次读取的偏移量,并确保发送所有日志行。如果输出(例如 Elasticsearch 或 Logstash)不可访问,Filebeat 将跟踪最后发送的行,并在输出再次可用时继续读取文件。在 Filebeat 运行期间,还会为每个输入在内存中保留状态信息。当 Filebeat 重新启动时,将使用注册表文件中的数据来重建状态,Filebeat 将在最后一个已知位置继续每个采集器。
对于每个输入,Filebeat 都保留其找到的每个文件的狀態。由于文件可以重命名或移动,因此文件名和路径不足以标识文件。对于每个文件,Filebeat 都存储唯一的标识符以检测以前是否已采集过该文件。
如果您的用例涉及每天创建大量新文件,您可能会发现注册表文件会变得太大。有关您可以设置以解决此问题的配置选项的详细信息,请参见 注册表文件太大。
Filebeat 如何确保至少一次交付?
编辑Filebeat 保证事件将至少交付一次到已配置的输出,并且不会丢失数据。Filebeat 能够实现此行为,因为它将每个事件的交付状态存储在注册表文件中。
在定义的输出被阻塞且未确认所有事件的情况下,Filebeat 将继续尝试发送事件,直到输出确认已收到事件。
如果 Filebeat 在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。在 Filebeat 关闭之前发送到输出但未确认的任何事件,将在 Filebeat 重新启动时再次发送。这确保每个事件至少发送一次,但最终可能会导致重复的事件被发送到输出。您可以通过设置 shutdown_timeout
选项来配置 Filebeat 在关闭之前等待特定时间。
Filebeat 的至少一次交付保证存在一个与日志轮转和旧文件删除相关的限制。如果日志文件写入磁盘的速度快于 Filebeat 处理它们的速度,或者在输出不可用时删除文件,则可能会丢失数据。在 Linux 上,由于 inode 重用,Filebeat 也可能跳过行。有关 inode 重用问题的更多详细信息,请参见 常见问题。