filebeat 是一个轻量型日志采集器,本质上是一个 agent 。不依赖于任何应用,可以安装在任何节点上,可单独使用 Filebeat 并根据配置读取对应位置的日志进行上报和搜集。
filebeat 内置了常用的 output 组件,例如 kafka、ElasticSearch、redis 等,也可以输出到 console 和 file 。可以利用现有的 output 组件,将日志进行上报。也可以自定义 output 组件,让 Filebeat 将日志转发到我们想要的地方。
原理
filebeat 由两个主要组件组成:harvester 和 prospector。
harvester:采集器,负责读取一个文件的内容。它会逐行读取文件内容,并将内容发送到 output 指定的目的地。
prospector:查找器,负责管理 harvester 并找到所有需要读取的文件源。比如类型是日志,prospector 就会遍历制定路径下的所有匹配要求的文件。
Filebeat 如何记录文件状态
filebeat 将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住 harvester 收集文件的偏移量。若连接不上输出设备,如 ES、Kafka 等,filebeat 会记录发送前的最后一行,并再可以连接的时候继续发送。
filebeat 在运行的时候 prospector 状态会被记录在内存中。
当 filebeat 重启的时候,利用 registry 记录的状态来进行重建,用来还原到重启之前的状态。每个 prospector 会为每个找到的文件记录一个状态,对于每个文件,filebeat 存储唯一标识符以检测文件是否先前被收集,以此确保数据不丢失。
Filebeat 如何保证事件至少被输出一次
filebeat 之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为 filebeat 将每个事件的传递状态保存在文件中。
在未得到输出方确认时,filebeat 会尝试一直发送,直到得到回应。若 filebeat 在传输过程中被关闭,则不会再关闭之前确认所有时事件。
任何在 filebeat 关闭之前为确认的时间,都会在 filebeat 重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置 shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。
Filebeat 工作流程
当开启 filebeat 程序的时候,它会启动一个或多个查找器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件。filebeat 启动采集器(harvester),每一个采集器进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后 filebeat 会发送集合的数据到你指定的地点。
配置
由于安装简单,在此直接略过。
filebeat.yml 是 filebeat 的配置文件,配置文件的路径会因为你安装方式的不同而变化。
关于详细配置请参考官网:
filebeat.yml 文件格式配置
filebeat 配置说明
重要配置说明
filebeat.prospectors
文件监视器,用于指定需要关注的文件。
filebeat.inputs:
# type为 log 类型,表示收集日志文件数据。
- type: log
id: filebeat-user-log
enabled: true
# paths:是一个文件路径数组,这里扫描/data/logs/目录下所有 .log 文件。
paths:
- /data/logs/*.log
# 定义日志标签,注意:不同的服务使用不同的标签
tags: ["user-log"]
output.elasticsearch
如果你希望使用 filebeat 直接向 elasticsearch 输出数据,需要配置 output.elasticsearch 。
output.elasticsearch:
hosts: ["192.168.200.11:9200"]
#username: "elastic"
#password: "elastic"
如果你希望使用 filebeat 直接向 kafka 输出数据,需要配置 output.kafka 。
output.kafka:
enable: true
hosts: ["192.168.200.11:9092"]
topic: "elk_topic"
output.logstash
如果你希望使用 filebeat 向 logstash 输出数据,然后由 logstash 再向 elasticsearch 输出数据,需要配置 output.logstash。
output.logstash:
hosts: ["192.168.200.11:5044"]
此外,还需要在 logstash 的配置文件(logstash.conf)中指定 beats input 插件:
input {
# 配置接收 filebeat 数据源,监听端口为5044,Filebeat 中的 output.logstash 地址保持跟这里一致
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://192.168.200.11:9200"]
index => "elk-%{+YYYY.MM}"
# user => "elastic"
# password => "changeme"
}
}
相比于向 elasticsearch 输出数据,更推荐向 logstash 输出数据。因为 logstash 和 filebeat 一起工作时,如果 logstash 忙于处理数据,会通知 FileBeat 放慢读取速度。
一旦拥塞得到解决,fileBeat 将恢复到原来的速度并继续传播。这样,可以减少管道超负荷的情况。
setup.kibana
如果打算使用 Filebeat 提供的 Kibana 仪表板,需要配置 setup.kibana 。
setup.kibana:
host: "192.168.200.11:5601"
setup.dashboards
filebeat 附带了示例 kibana 仪表板。在使用仪表板之前,您需要创建索引模式 filebeat- *,并将仪表板加载到 kibana 中。为此,您可以运行 setup 命令或在 filebeat.yml 配置文件中配置仪表板加载。
为了在 Kibana 中加载 Filebeat 的仪表盘,需要在 filebeat.yml 配置中启动开关:
setup.dashboards.enabled: true
更多详情请见:Configure Kibana dashboard loading