Filebeat概览
Filebeat 是一个轻量级的传送器,用于转发和集中日志数据。Filebeat 作为代理安装在您的服务器上,监控您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash以进行索引。
Filebeat 的工作原理如下:当您启动 Filebeat 时,它会在指定的日志数据的位置启动一个或多个查找的inputs。对于 Filebeat 找到的每个日志,Filebeat 都会启动一个收集器(harvester)。每个harvester读取单个日志的新内容,并将新日志数据发送到 libbeat。libbeat聚合事件并将聚合数据发送到您为 Filebeat 配置的输出。
Filebeat 是一个elastic beat。它基于libbeat框架。
Beats
https://www.elastic.co/cn/beats/
Beats平台参考
https://www.elastic.co/guide/en/beats/libbeat/7.13/index.html
Filebeat工作原理
有关input和harvester的更多信息:https://www.elastic.co/guide/en/beats/filebeat/current/how-filebeat-works.html
Filebeat由两个主要组件组成:input和harvester。组件共同作用于日志文件尾部,然后将事件数据发送到指定的output。
什么是harvester?
harvester负责读取单个文件的内容。为每个文件起一个harvesrer,harvester逐行读取文件,并将内容发送到output。
harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在获取文件时删除或重命名了文件,Filebeat将继续读取该文件。这样做的副作用是,在harvester关闭之前,磁盘上的空间是保留的。
默认情况下,Filebeat保持文件打开,直到close_inactive。
关闭harvester有以下后果:
如果在harvester仍在读取文件时删除了文件,则文件处理程序将关闭,从而释放底层资源。
文件的收集将在scan_frequency结束后重新开始。
如果在harvester关闭时移动或移除文件,则不会继续收割文件。
要控制harvester何时关闭,可以调用 close_*配置选项。
什么是input?
input负责管理harvester,并且负责找到所有要读取的源。
如果输入类型为log,则input会查找磁盘上与定义的全局路径匹配的所有文件,并为每个文件启动harvester。每个input都在自己的goroutine(go语言的协程)中运行。
以下示例将 Filebeat 配置为从与指定的 glob 模式匹配的所有日志文件中收集行:
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
- /var/path2/*.log
Filebeat 目前支持多种input类型。每个输入类型可以定义多次。该log类型的input检查每个文件的harvester是否需要启动,是否已经在运行,或文件是否可以忽略不计(见ignore_older)。仅当harvester关闭后,文件的大小发生变化时才会收集新行。
Filebeat如何持久化文件的状态?
Filebeat 保持每个文件的状态,并经常将状态刷新注册表文件中的数据到磁盘中。该状态用于记住haevester读取的最后一个偏移量,并确保发送所有日志行。
如果无法访问output(例如 Elasticsearch 或 Logstash),Filebeat 会跟踪发送的最后一行,并在output再次可用时继续读取文件。
当 Filebeat 运行时,每个输入的状态信息也保存在内存中。当 Filebeat 重新启动时,来自注册表文件的数据用于重建状态,Filebeat从最后一个已知位置继续运行hasverter 。
对于每个input,Filebeat 会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以识别文件。对于每个文件,Filebeat 存储唯一标识符以检测之前是否收集了文件。
如果您的用例涉及每天创建大量新文件,您可能会发现注册表文件变得太大。有关可以设置以解决此问题的配置选项的详细信息,请参阅https://www.elastic.co/guide/en/beats/filebeat/current/reduce-registry-size.html
Filebeat如何确保at-least-once-delivery(至少一次交付)?
Filebeat 保证事件将至少一次传送到配置的output,并且没有丢失数据。Filebeat 能够实现这种行为,因为它将每个事件的传递状态存储在注册表文件中。
在定义的output被阻塞并且没有确认所有事件的情况下,Filebeat 将继续尝试发送事件,直到output确认它已收到事件。
如果 Filebeat 在发送事件的过程中关闭,它不会在关闭之前等待输出确认所有事件。任何发送到output但在 Filebeat 关闭之前未确认的事件,将在 Filebeat 重新启动时再次发送。这可确保每个事件至少发送一次,但最终可能会将重复的事件发送到output。您可以通过设置shutdown_timeout选项将 Filebeat 配置为在关闭之前等待特定时间。
Filebeat 的至少一次交付保证存在限制,涉及日志轮换和删除旧文件时。如果将日志文件写入磁盘并以比 Filebeat 处理它们的速度快的速度,或者如果在output不可用时删除文件,则数据可能会丢失。在 Linux 上,Filebeat 也有可能因 inode 重用而跳过行。有关inode 重用问题的更多详细信息,请参阅https://www.elastic.co/guide/en/beats/filebeat/current/faq.html