FileBeat 安装及实现日志采集
- 需求分析
- 配置介绍
- 安装及配置
- 启动及测试
- 日志合并的问题
需求分析
通过 FleBeat 采集 Kafka 的日志到 Elasticsearch 中,实现在 Elasticsearch 中快速查询日志,定位问题
配置介绍
FileBeat 配置文件主要分为两个部分
① inputs
② output
input配置
在 FileBeats 中,可以读取一个或多个数据源(日志文件),用来做日志数据的输入
① 配置格式
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
#- c:\programdata\elasticsearch\logs\*
② 配置介绍
output配置
配置一个输出源,最终的数据将会输出到指定的输出源,FileBeat 默认会将日志数据放入到名称为:filebeat-%filebeat版本号%-yyyy.MM.dd
的索引中
① 配置格式
output.elasticsearch:
hosts: ["node1:9200", "node2:9200", "node3:9200"]
② 配置介绍
安装及配置
下载安装包
Download Elastic Stack FileBeat 7.6.1
上传并解压
tar -xvzf filebeat-7.6.1-linux-x86_64.tar.gz
配置输入和输出信息
cd /opt/server/es/filebeat-7.6.1-linux-x86_64
vim filebeat_kafka_log.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/server/es/data/kafka/server.log.*
output.elasticsearch:
hosts: ["node1:9200", "node2:9200", "node3:9200"]
启动及测试
启动
./filebeat -c filebeat_kafka_log.yml -e
测试
# 在 elasticsearch 中查看索引信息
GET _cat/indices
日志合并的问题
遇到的问题
FileBeat 默认将每一行日志作为一条文档数据,但是在日志中包含一些异常信息,对于异常信息,我们需要将完整的一个报错信息算作一个 Elasticsearch
日志索引的文档
因此我们需要解决的问题是:将多行数据算作一条文档数据
FileBeat 多行配置选项
在 FileBeat 的配置中,专门有一个解决一条日志跨多行问题的配置。主要为以下三个配置:
# multiline.pattern 表示能够匹配一条日志的模式,默认配置的是以 [ 开头的才认为是一条新的日志
# multiline.negate 配置该模式是否生效,默认为 false
# multiline.match 表示是否将未匹配到的行追加到上一日志,还是追加到下一个日志
multiline.pattern: ^\[
multiline.negate: false
multiline.match: after
问题解决
① 增加数据跨行配置
每条日志都是有统一格式的开头的,就拿Kafka的日志消息来说,[2020-04-30 14:00:05,725]这是一个统一的格式,如果不是以这样的形式开头,说明这一行肯定是属于某一条日志,而不是独立的一条日志。所以,我们可以通过日志的开头来判断某一行是否为新的一条日志
cd /opt/server/es/filebeat-7.6.1-linux-x86_64
vim filebeat_kafka_log.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/server/es/data/kafka/server.log.*
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
output.elasticsearch:
hosts: ["node1:9200", "node2:9200", "node3:9200"]
② 删除之前采集的文档数据
第一种删除方法:配置删除
# 修改注册表,将 server.log.error 对应的offset设置为0
cd /opt/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat
vim data.json
{
"source": "/opt/server/kafka-log/server.log.error",
"offset": 0,
"timestamp": "2021-08-12T12:05:07.445025565+08:00",
"ttl": -1,
"type": "log",
"meta": null,
"FileStateOS": {
"inode": 23367,
"device": 64769
}
}
// 删除指定文件的文档
POST /filebeat-7.6.1-2021.08.12-000001/_delete_by_query
{
"query": {
"match": {
"log.file.path": "/opt/server/kafka-log/server.log.error"
}
}
}
第二种删除:直接删除
# 在 FileBeat 中删除 FileBeat 的元数据
cd /opt/server/es/filebeat-7.6.1-linux-x86_64/data/registry
rm -rf filebeat/*
# 删除之前的数据ES中的数据
delete /filebeat-7.6.1-2021.08.12-000001
③ 重启 FileBeat