Filebeat使用与配置

649 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

启动

启动命令示例如下:

docker run --log-opt max-size=100m --user root --net host --name filebeat -v $PWD/filebeat/data:/usr/share/filebeat/data -v $PWD/filebeat/logs:/usr/share/filebeat/logs -v /logs:/usr/share/filebeat/logdata -e ES_HOSTS="es-1.dx.corp:9200,es-2.dx.corp:9200" -e LOG_PATH="/usr/share/filebeat/logdata/request_details.log" -d filebeat:5.4.3

注意: 需要将监控的日志目录映射到filebeat容器中, 同时配置一个环境变量LOG_PATH用于指定在filebeat容器中的路径, ES_HOSTS 指定es地址, 集群逗号分隔, 注意端口号是http端口
如果默认配置不满足需求, 可以将配置文件重新映射到容器中, 容器内路径是/usr/share/filebeat/filebeat.yml

配置与使用说明

close_inactive 
该参数指定当被监控的文件多长时间没有变化后就关闭文件句柄(file handle)。官方建议将这个参数设置为一个比文件最大更新间隔大的值。比如文件最长5s更新一次,那就设置成1min。默认值为5min.

scan_frequency 
该参数指定Filebeat搜索新文件的频率(时间间隔)。当发现新的文件被创建时, Filebeat会为它再启动一个 harvester 进行监控。默认为10s。

clean_inactive: 72h
这个配置项也应该配置上,默认值是0表示不清理,不清理的意思是采集过的文件描述在registry文件里永不清理,在运行一段时间后,registry会变大,可能会带来问题。

ignore_older: 70h
设置了clean_inactive后就需要设置ignore_older,且要保证ignore_older < clean_inactive

当logback完成日志切割后(即重命名),此时老的harvester仍然在监控重命名后的日志文件,但是由于该文件不会再更新,因此会在close_inactive时间后关闭这个文件的 harvester。当scan_frequency时间过后,Filebeat会发现目录中出现了新文件,于是为该文件启动 harvester 进行监控。这样就保证了切割日志时也能不丢不重的传输数据。对于同一个文件经过较长时间后再更新, 也会在scan_frequency时间过后重新启动harvester

# harvester关闭日志
2020/08/20 06:32:18.206200 log.go:116: INFO File is inactive: /usr/share/filebeat/logdata/request_details.log. Closing because close_inactive of 5m0s reached.

# 启动 harvester日志
2020/08/20 06:27:43.197758 log.go:91: INFO Harvester started for file: /usr/share/filebeat/logdata/request_details.log

 

filebeat的data/registry文件中存放的是被采集的所有日志的相关信息。

linux中registry中一条日志记录的内容如下

[{	"source": "/usr/share/filebeat/logdata/request_details.log",	"offset": 29973,	"FileStateOS": {		"inode": 5784066,		"device": 2049	},	"timestamp": "2020-08-20T14:20:28.328896978+08:00",	"ttl": 259200000000000}, {	"source": "/usr/share/filebeat/logdata/request_details.log",	"offset": 1430,	"FileStateOS": {		"inode": 5784064,		"device": 2049	},	"timestamp": "2020-08-20T14:27:13.644183981+08:00",	"ttl": 259200000000000}, {	"source": "/usr/share/filebeat/logdata/request_details.log",	"offset": 1427,	"FileStateOS": {		"inode": 5784049,		"device": 2049	},	"timestamp": "2020-08-20T14:27:44.14364326+08:00",	"ttl": 259200000000000}]

这条记录中的各个字段的意义分别为

source 日志文件完整路径
offset 已经采集的日志的字节数;已经采集到日志的哪个字节位置
filestateos  操作系统相关
inode  日志文件的inode号 // linux, ls -i
device    日志所在磁盘的磁盘编号
timestamp  日志最后一次发生变化的时间戳
ttl  采集失效时间。-1表示只要日志存在,就一直采集该日志
复制代码
[dx@cdh3 logs]$ ls -il request_details.*
5772009 -rw-r--r-- 1 root root     0 Mar 17 11:06 request_details.2020-03-17.0.log
5784066 -rw-r--r-- 1 root root 29973 Aug 20 14:15 request_details.2020-08-20.0.log
5784064 -rw-r--r-- 1 root root  1430 Aug 20 14:27 request_details.2020-08-20.1.log
5784049 -rw-r--r-- 1 root root  1427 Aug 20 14:27 request_details.log

可以看到 5784066, 5784064, 5784049 这三个文件对应到registry文件中的offset都等于文件大小, 表示都采集完成了