Filebeat 是一个轻量级的日志采集工具, 监听日志的修改, 并将它们传给 Elasticsearch 或 Logstash
Filebeat 工作流程如下图所示
Filebeat 主要包含 inputs 和 harvesters 两大组件
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
以上内容配置 filebeat 从 /var/log 目录以 .log 结尾的所有文件中读取日志数据
filebeat 会记录每个日志文件的读取进度, 每隔一段时间将进度信息保存至 registry 文件, 当 filebeat 重启时, 从 registry 文件获取最后读取的偏移位置
下载页面
下载二进制压缩文件并解压
tar -xzf filebeat-7.14.1-linux-x86_64.tar.gz
sudo mv filebeat-7.14.1-linux-x86_64 /usr/share/
配置环境变量, 将以下内容置于 .bashrc 末尾
export PATH="$PATH:/usr/share/filebeat-7.14.1-linux-x86_64"
配置文件示例(假设保存于 ~/Public/filebeat.yaml)
filebeat.inputs:
- type: log
paths:
- /home/jianghuixin/Public/Test.log
output.console:
enabled: true
pretty: true
path.home: /home/jianghuixin/Public/Filebeat
~/Public/Filebeat/data
中~/Public/Filebeat/logs
中测试文件 Test.log 内容为:
01-Filebeat
02-Filebeat
03-Filebeat
启动 filebeat
# filebeat 配置文件仅属主可写, 属组和其他用户没有写入的权限
chmod u+x,go-w ~/Public/filebeat.yaml
# -c FILE 指定 filebeat 配置文件
filebeat -c ~/Public/filebeat.yaml
结果包含 3 个 JSON 输出(仅列举其中之一)
{
"@timestamp": "2021-09-13T06:15:46.235Z",
"@metadata": {
"beat": "filebeat",
"type": "_doc",
"version": "7.14.1"
},
"log": {
"file": {
"path": "/home/jianghuixin/Public/Test.log"
},
"offset": 24
},
"message": "03-Filebeat",
"input": {
"type": "log"
},
"ecs": {
"version": "1.10.0"
},
"host": {
"name": "911ME"
},
"agent": {
"hostname": "911ME",
"ephemeral_id": "c0b23fa8-5776-4cf4-8c8a-ed65f0cc50d4",
"id": "a59bb19c-e987-449c-9d7c-c0663e316ec0",
"name": "911ME",
"type": "filebeat",
"version": "7.14.1"
}
}
测试配置文件
# 测试配置是否正确
filebeat test config -c ~/Public/filebeat.yaml
# 测试输出是否正常, 针对 Logstash, Elasticsearch 等输出, 检查能否成功连接
filebeat test output -c ~/Public/filebeat.yaml
有些日志的格式并不是一行对应一条日志, 例如一条报错信息会占用多行, 通过设置 multiline 读取多行日志并输出为一条日志
multiline 包含以下具体配置项:
multiline.type: pattern
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
multiline.type 通常为 pattern 表示正则匹配, 其内部使用 Golang 的正则匹配
这里 multiline 的配置规则与 Logstash multiline codec 基本一致
配置项的含义如下图所示:
这里通过 Python 的错误日志演示
Traceback (most recent call last):
File "Test.py", line 1, in
1 / 0
ZeroDivisionError: division by zero
Traceback (most recent call last):
File "Test.py", line 1, in
test
NameError: name 'test' is not defined
Traceback (most recent call last):
File "Test.py", line 1, in
import django
ModuleNotFoundError: No module named 'django'
此处采用上图中的第三个配置, 以 Traceback 为起始行, 其它行均合到该行, 直至另一个 Traceback 行
Filebeat 的配置为:
filebeat.inputs:
- type: log
paths:
- /home/jianghuixin/Public/Test.log
fields:
language: Python3
multiline.type: pattern
multiline.pattern: '^Traceback'
multiline.negate: true
multiline.match: after
output.console:
enabled: true
pretty: true
path.home: /home/jianghuixin/Public/Filebeat
fields 字段会原封不动地保存至当前输入对应的输出中
输出中包含 3 个消息, 以下为最后一条消息:
{
"@timestamp": "2021-09-15T15:11:52.906Z",
"@metadata": {
"beat": "filebeat",
"type": "_doc",
"version": "7.14.1"
},
"input": {
"type": "log"
},
"fields": {
"language": "Python3"
},
"ecs": {
"version": "1.10.0"
},
"host": {
"name": "911ME"
},
"agent": {
"id": "b144ad98-53d1-4d0d-bbb8-89787981e709",
"name": "911ME",
"type": "filebeat",
"version": "7.14.1",
"hostname": "911ME",
"ephemeral_id": "2dd82e68-2b63-4a20-95b7-c056e68a5e26"
},
"log": {
"offset": 239,
"file": {
"path": "/home/jianghuixin/Public/Test.log"
},
"flags": [
"multiline"
]
},
"message": "Traceback (most recent call last):\n File \"Test.py\", line 1, in \n import django\nModuleNotFoundError: No module named 'django'"
}
输出中的 fields 字段与输入配置中的 fields 保持一致