Filebeat工作原理
Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。
使用了背压敏感协议,因此不会使管道过载。当Logstash数据处理繁忙时,Filebeat放慢它的读取速度。一旦压力解除,Filebeat将恢复到原来的速度,继续传输数据。
Filebeat主要由下面几个组件组成: harvester、prospector 、input
一台服务器只能启动一个filebeat进程。
参考文档:https://cloud.tencent.com/developer/article/1367784
filebeat主要模块
Crawler: 管理所有Input收集数据并发送事件到libbeat的Publisher
Input: 对应可配置的一种输入类型,每种类型都有具体的Input和Harvester实现。 配置项
Harvester: 对应一个输入源,是收集数据的实际工作者。配置中,一个具体的Input可以包含多个输入源(Harvester)
module: 简化了一些常见程序日志(比如nginx日志)收集、解析、可视化(kibana dashboard)配置项
fileset: module下具体的一种Input定义(比如nginx包括access和error log),包含:1)输入配置;2)es ingest node pipeline定义;3)事件字段定义;4)示例kibana dashboard
Registrar:用于在事件发送成功后记录文件状态
libbeat主要模块
Publisher:
client: 提供Publish接口让filebeat将事件发送到Publisher。在发送到队列之前,内部会先调用processors(包括input 内部的processors和全局processors)进行处理。
processor: 事件处理器,可对事件按照配置中的条件进行各种处理(比如删除事件、保留指定字段等)。配置项
queue: 事件队列,有memqueue(基于内存)和spool(基于磁盘文件)两种实现。配置项
outputs: 事件的输出端,比如ES、Logstash、kafka等。配置项
acker: 事件确认回调,在事件发送成功后进行回调
autodiscover:用于自动发现容器并将其作为输入源
harvester
- 负责读取单个文件的内容
- harvester逐行读取每个文件(一行一行读取),并把这些内容发送到输出
- 每个文件启动一个harvester,并且harvester负责打开和关闭这些文件,这就意味着harvester运行时文件描述符保持着打开的状态。
- 在harvester正在读取文件内容的时候,文件被删除或者重命名了,那么Filebeat就会续读这个文件,这就会造成一个问题,就是只要负责这个文件的harvester没有关闭,那么磁盘空间就不会被释放
- 默认情况下,Filebeat保存文件打开直到close_inactive到达
Harvester负责读取单个文件的内容。读取每个文件,并将内容发送到配置指定的output,每个文件启动一个harvester, harvester负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态。
如果文件在读取时被删除或重命名,Filebeat将继续读取文件。这有副作用,即在harvester关闭之前,磁盘上的空间被保留。默认情况下,Filebeat将文件保持打开状态,直到达到close_inactive状态
prospector
-
prospector负责管理harvester并找到所有要读取的文件来源
-
如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester
-
Filebeat目前支持两种prospector类型:log和stdin
-
Filebeat如何保持文件的状态
Filebeat保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中
该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。
如果输出(例如ElasticSearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可以用时继续读取文件。
在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebat时,将使用注册文件的数量来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取
文件状态记录在data/registry文件中
input
-
一个input负责管理harvester,并找到所有要读取的源
-
如果input类型是log,则input查找驱动器上与已定义的log路径匹配的所有文件,并为每个文件启动一个harvester
-
每个input都在自己的Go例程中运行
-
下面的例子配置Filebeat从所有匹配指定的log模式的文件中读取行
模块的使用
查看有哪些模块
./filebeat modules list
启动和关闭模块
#启动
./filebeat modules enable nginx
#禁用
./filebeat modules disable nginx
使用
nginx安装参考文档: https://blog.csdn.net/qq_52589631/article/details/129675424?spm=1001.2014.3001.5501
创建一个 nginx-log.yml 配置文件,启动nginx的模块功能
filebeat modules enable nginx
nginx-log.yml配置文件内容
filebeat.inputs:
- type: logenabled: truepaths:- /usr/local/nginx1/logs/*.log #nginx日志存放路径tags: ["nginx"]fields_under_root: false
setup.template.settings:index.number_of_shards: 1
output.elasticsearch:hosts: ["192.168.40.150:9200","192.168.40.137:9200","192.168.40.138:9200"]
cd modules.d/
vim nginx.yml
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-nginx.html- module: nginx# Access logsaccess:enabled: true# 添加日志文件var.paths: ["/usr/local/nginx1/logs/access.log*"]# Set custom paths for the log files. If left empty,# Filebeat will choose the paths depending on your OS.#var.paths:# Error logserror:enabled: truevar.paths: ["/usr/local/nginx1/logs/error.log*"]
filebeat.inputs:
setup.template.settings:index.number_of_shards: 1
output.elasticsearch:hosts: ["192.168.40.150:9200","192.168.40.137:9200","192.168.40.138:9200"]
filebeat.config.modules:path: $