filebeat配置文件

https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html

Filebeat 有两大部分,inputsharvestersinputs 负责找文件(类似 find 命令)和管理 harvesters,一个 harvester 则和一个文件一一对应,一行行读然后发送给 output(类似tail -f)。

ignore_older

路径下的历史文件可能很多,比如配置了按天分割,显然旧文件我们一般是不需要的。

通过 ignore_older 参数解决,意思是多久前的旧文件不扫描。
比如设置为 1h,表示文件时间在 1h 之前的日志都不会被 input 模块搜集,直到有新日志产生。

scan_frequency

扫描频率如何控制,通配设置复杂的话频繁扫文件也是很大的开销。

通过 scan_frequency 参数控制,表示多久扫描一次是否有新文件产生。
比如设置 10s(默认),一个新文件产生 10s 后会被发现,或者一个旧文件(上面 ignore_older)新产生了一行日志 10s 才发现这个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
filebeat.inputs:
- type: log # 指定文件的输入类型log(默认)或者stdin
enabled: true
tag: ['log']
scan_frequency: 10s
paths:
# /**/可动态获取八层嵌套的log日志文件
- /log/**/*.log
#- /log/access.log
fields:
source: log
# 默认json日志在filebeat发送内容的json字段内,如需放在根root下,需打开此开关
#json.keys_under_root: true

# json字段是否覆盖filebeat默认的字段,例如日志的时间覆盖filebeat的@timestamp
#json.overwrite_keys: true

# 当json出错时封装一个error.message错误消息字段
#json.add_error_key: true

# json解析选项,当你的日志为json格式时启用,用于过滤单行和多行的设置。这个字段名必须是json根字段名且值必须是String类型,否则配置不生效。如果此项配置未定义,将无法使用多行配置
#json.message_key:
# 多行合并配置
# 匹配的正则表达式,如下面的意思是匹配以日期格式yyyy-MM-dd HH:mm:ss 开头的行
multiline.pattern: '[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\+[0-9]{2}:[0-9]{2}'
# 是否取反,即当不以日期格式开头时
multiline.negate: true
# 匹配规则,before 还是 after。三个配置加起来的意思是: 读取的行不以日期开头时,合并到以日期开头为一行。例如堆栈异常多行信息应当合并为一行消息
multiline.match: after

# 默认的模板名称是 "filebeat-%{[agent.version]}",这里可以指定自定义的index template名称
#setup.template.name: "service-log-"
setup.template.name: "filebeat-log"

# 默认的模板匹配规则是 "-%{[agent.version]}-*" ,这个pattern需要在kibana中创建
#setup.template.pattern: "service-log-*"
setup.template.pattern: "filebeat-log-*"
setup.template.overwrite: true
setup.template.enabled: true
#关闭ilm,否则索引名称不生效
setup.ilm.enabled: false


# 输出到ES
output.elasticsearch:
hosts: ["elasticsearch:9200"]
username: "elastic"
password: "elastic"

# 输出的索引名称,需要指定setup.template.name和setup.template.pattern
output.elasticsearch.index: "filebeat-log-%{+yyyy.MM.dd}"

# 输出到kibana的地址
setup.kibana:
host: "kibana:5601"
# username: "elastic"
# password: "elastic"

clean_* 配置簇

The clean_* options are used to clean up the state entries in the registry file.

Filebeat 内部记录了很多文件状态,保存在 data/registry/filebeat/data.json。如果不清理的话这个文件会越来越大,影响效率。

1
2
3
4
5
6
7
8
9
10
11
12
{
"source": "/xxx/logs/logFile.2021-09-20.log",
"offset": 661620031,
"timestamp": "2021-09-21T00:04:23.050179808+08:00",
"ttl": 10800000000000,
"type": "log",
"meta": null,
"FileStateOS": {
"inode": 184559118,
"device": 2056
}
}

clean_inactive
多久清理一次注册信息。默认值是0(不开启clean_*相关功能)

清理的文件信息需要保证这个文件已经不活跃了,所以这个值需要大于 ignore_older + scan_frequency
不然的话清理后这个文件又被发现,则会重头开始读取,这样就重了。

clean_removed
文件被删除后是否清理注册信息,默认开启。
需要和 close_removed 值保持一致

简单总结几个时间配置:
clean_inactive > ignore_older + scan_frequency > close_inactive

推荐配置:

1
2
3
4
5
6
7
8
tail_files: false
scan_frequency: 10s
ignore_older: 60m
close_inactive: 10m
close_renamed: true
close_removed: true
clean_inactive: 70m
clean_removed: true

资源限制

在日志非常多机器负载高的时候加重机器负担,建议生产环境上需要对 Filebeat 资源进行限制:
max_procs 最多使用多少核,默认会全部使用,按机器情况限制为1-4核,不太会影响推送效率。

配置自动加载

1
2
3
4
5
filebeat.config.inputs:
enabled: true
path: configs/*.yml
reload.enabled: true
reload.period: 10s

具体的 input 配置文件放在 configs 文件夹下,例如:

1
2
3
4
- type: log
paths:
- /var/log/messages
- /var/log/*.log