日志系统架构上可分为收集、纳管、展示三个层级,业界常说的ELK架构是指elasticsearch(搜索、存储)、Logstash(采集、清洗)、Kibana(展示)的日志系统解决方案。在日志采集方面,logstash对内存、CPU、io等资源消耗比较高,与同类产品Beats比,性能有较大的开销。
Beats是一个轻量级日志采集器,目前Beats家族有7个成员:
- Packetbeat:网络数据(收集网络流量数据)
- Metricbeat:指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
- Filebeat:日志文件(收集文件数据)
- Winlogbeat:Windows事件日志(收集Windows事件日志数据)
- Auditbeat:审计数据(收集审计日志)
- Heartbeat:运行时间监控(收集系统运行时的数据)
- Functionbeat: 面向云端数据的无服务器采集器
了解更多可查看官方文档
Filebeat
Filebeat
是用于转发和集中日志数据的轻量级传送工具。Filebeat
监视服务器上指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch
或 Logstash
进行索引。
工作流程
启动Filebeat
时,它将启动一个或多个input
(输入),这些input
会在指定的日志数据目录中查找。对于Filebeat
所找到的每个日志,Filebeat
都会启动harvester
(收集器)。每个harvester
都读取单个日志以获取新内容,并将新日志数据发送到libbeat
,libbeat
将聚集事件,并将聚集的数据发送到为Filebeat配置的output
(输出)。
实现原理
组件构成
Filebeat
由inputs
(输入)和harvesters
(收集器)这两个组件组成,这些组件一起工作来跟踪文件并将事件数据发送到指定的output(输出)。
harvester负责读取单个文件的内容。harvester逐行读取每个文件,并将内容发送到输出。为每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。
一个input负责管理harvesters和寻找所有来源读取。如果input类型是log,则input将查找驱动器上与定义的路径匹配的所有文件,并为每个文件启动一个harvester。每个input在它自己的Go协程中运行,Filebeat当前支持多种输入类型。每个输入类型可以定义多次。日志输入检查每个文件,以查看是否需要启动一个harvester,是否已经在运行,或者是否可以忽略该文件(参见ignore_older)。只有在harvesters(收集器)关闭后文件的大小发生变化时,才会提取新行。
如何保存文件的状态
Filebeat保留每个文件的状态,并经常将状态刷新到磁盘中的注册表文件中。该状态用于记住harvester读取的最后一个偏移量,并确保发送所有日志行。如果无法访问输出(如Elasticsearch或Logstash),Filebeat将跟踪最后发送的行,并在输出再次可用时继续读取文件。当Filebeat运行时,每个输入的状态信息也保存在内存中。当Filebeat重新启动时,将使用来自注册表文件的数据重新构建状态,Filebeat在最后一个已知位置继续每个harvester。
对于每个输入,Filebeat都会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以标识文件。对于每个文件,Filebeat存储唯一的标识符,以检测文件是否以前被捕获。
如何保证至少一次数据消费
因为它将每个事件的传递状态存储在注册表文件中。在已定义的输出被阻止且未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认已接收到事件为止。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。当Filebeat重新启动时,将再次将Filebeat关闭前未确认的所有事件发送到输出。这样可以确保每个事件至少发送一次,但最终可能会有重复的事件发送到输出。通过设置shutdown_timeout
选项,可以将Filebeat配置为在关机前等待特定时间。
安装
filebeat提供多种部署模式:
- rpm包
- docker
- kubernetes
本次实验采用rpm包的方式进行。
环境描述
主机名 | ip地址 | 系统环境 | 系统版本 | 内核版本 |
---|---|---|---|---|
test1 | 192.168.100.10 | cpu:x4 mem:8GB filesystem:50GB | CentOS 7.9.2009 | 3.10.0-1160.el7.x86_64 |
本地之前已经安装了nginx服务,后面拿该服务作为用例测试。
因本次使用6.8.x版本filebeat进行实验,涉及到的配置可能与高版本有差异。
下载软件包
登录官网地址下载对应版本软件包
本地解压并安装
1 | [root@test1 ~]# ls |
配置filebeat
默认的配置文件在/etc/filebeat/filebeat.yml
1 | [root@test1 ~]# rpm -qc filebeat |
配置示例文件:/etc/filebeat/filebeat.reference.yml
(包含所有未过时的配置项)
输入与输出配置
filebeat 支持的input(输出)有以下几种:
filebeat 支持的output(输出)有以下几种:
其中常用的输入是log,输出是es,本次不搭建es了,输出类型选择file。
下面是对log组件的官方配置项介绍进行简要解释:
1 | paths: #指定要监控的日志,目前按照Go语言的glob函数处理。没有对配置目录做递归处理,比如配置的如果是: |
1 | 所有输入都支持以下配置选项: |
file组件的配置项如下进行简要解释:
1 | output.file: |
配置文件
测试用例nginx服务的日志路径为/var/log/nginx
filebeat 配置文件内容如下:
1 | filebeat.inputs: |
查看当前/var/log/nginx
目录
1 | [root@test1 nginx]# ll /var/log/nginx/ |
启动filebeat
查看通过rpm安装的filebeat默认的启动文件:
1 | [root@test1 nginx]# systemctl cat filebeat.service --no-pager |
启动服务
1 | [root@test1 nginx]# systemctl start filebeat |
编辑/var/log/nginx/access.log
1 | [root@test1 nginx]# cat access.log |
查看日志
观察日志输出:
1 | 2021-12-20T11:11:08.761+0800 INFO instance/beat.go:611 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat] |
查看filebeat文件
1 | [root@test1 nginx]# cat /tmp/filebeat/slions_nginx_fb |
收集到的文件内容放置在了message中。
查看注册表文件
从之前的filebeat日志中可知注册表文件为/var/lib/filebeat/registry
1 | 2021-12-20T11:11:08.769+0800 INFO registrar/registrar.go:97 No registry file found under: /var/lib/filebeat/registry. Creating a new registry file. |
默认的路径是
${path.data}/registry
,可编辑配置文件中filebeat.registry_file: registry
对其修改。
配置
registry_flush
来控制何时将注册表项写入磁盘(刷新)的超时值。当一个未写的更新超过这个值时,当一个未写的更新超过这个值时,它会触发对磁盘的写操作。默认是0,既每批事件成功发布后,注册表将被写入磁盘。
每收集到一个文件都会将相关信息记录到注册表中,其中通过inode定位文件,通过offset识别位置,通过timestamp记录时间戳。
1 | [root@test1 nginx]# cat /var/lib/filebeat/registry |
注册表文件仅在刷新新事件时更新,而不是在预定义的时间段内更新。这意味着,在TTL过期的情况下,只有在处理新事件时,这些状态才会被删除。
Debug
默认情况下,Filebeat将其所有输出发送到syslog。在前台运行Filebeat时,使用-e命令行标志将输出重定向到标准错误。
1 | filebeat -e |
通过指定-c标志来使用不同的配置文件。
1 | filebeat -e -c myfilebeatconfig.yml |
启用一个或多个debug选择器,可以增加调试消息的冗长程度。例如,要查看与发布者相关的消息:
1 | filebeat -e -d "publisher" |
查看所有的调试输出,使用*:
1 | filebeat -e -d "*" |