1.1 简介
1.1.1 概述
Filebeat 是 Beats 的一员,用于转发和集中日志数据的轻量级传送工具。当面对成百上千、甚至成千上万的服务器、虚拟机和容器生成的日志时,Filebeat 将为您提供一种轻量型方法,监视指定的日志文件或位置,收集日志事件,并将它们转发到 Elasticsearch、 Logstash 等。
1.1.2 工作流程
Filebeat 涉及两个组件:查找器 prospector 和采集器 harvester,读取文件并将事件数据发送到指定的输出。启动 Filebeat 时,它会启动一个或多个查找器,查看你为日志文件指定的本地路径。Prospector 负责管理 harvester 并找到所有要读取的文件来源。如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为 Filebeat 监视的每个文件启动一个 harvester。当 harvester 读取到一个日志的新内容就发送到 libbeat,聚合起来然后把聚合的数据发送到设置输出的地方。
1.2 Filebeat 命令
1.2.1 基本命令
命令 | 说明 |
---|---|
export | 导出配置,索引模板、或者 dashboard 到 output 中 |
help | 显示所有命令的帮助 |
keystore | 管理私有的存储 |
modules | 管理配置的模块 |
run | 运行 Filebeat。如果我们不使用其他的 command 的话,默认执行的就是这个 |
setup | 设置一些初始化的环境,包括索引,kibana的dashboards,机器学习的一些任务 |
test | 测试配置文件是否正确 |
version | 显示当前版本的信息 |
1.2.2 keystore 的使用
当我们配置 Filebeat 的时候,我们可能需要设置一些敏感的配置项,如密码。相比依赖于文件系统权限来保护我们这些数据,更适合在配置的时候用 Filebeat 的 keystore 来安全存储这些数据。当我们加入了一个 key 和对应的密码信息到 keystore 后,在设置敏感配置项的时候可以使用 ${KEY}
来替代原来的密码信息。
# 创建 keystore
filebeat keystore create
# 添加 key,执行后会让你输入 key 对应的信息
# add KEY 将指定的密钥添加到密钥库
filebeat keystore add ES_PWD
# 使用 --force 标志覆盖现有密钥
filebeat keystore add ES_PWD --force
# 列举所有 key
filebeat keystore list
# 删除 key
filebeat keystore remove ES_PWD
# 使用 keystore
output.elasticsearch:
password: "${ES_PWD}"
1.3 输入
1.3.1 配置
配置 | 说明 |
---|---|
paths | 日志加载的路径 示例: - /var/log/*/*.log 抓取 /var/log 子目录目录下所有 *.log 文件 |
encoding | 根据输入的文本设置编码 示例:utf-8 |
exclude_lines | 不显示符合所配置的规则的行, 空行被忽略。 示例: ['^DBG'] 过滤 DBG 开头 |
include_lines | 显示符合所配置的规则的行, 空行被忽略 示例: ['^ERR', '^WARN'] 导出 ERR 或 WARN 开头 |
exclude_files | 排除的文件 示例: ['.gz$'] 排除以 gz 结尾的文件 |
harvester_buffer_size | 每个harvester的缓存大小,默认是16384 |
max_bytes | 单个日志消息可以发送的最大字节,默认是10MB |
json | json 配置 示例: json.keys_under_root: false key 是否输出到顶级目录 json.add_error_key: false 如果启用此设置, 则当出现 json 解编错误或在配置中定义了文本键但无法使用时, Filebeat 将添加 “error.message” 和 “error.key:json” 键json.message_key: log 用于应用行筛选和多行设置的JSON键。此键必须是顶级的,其值必须是字符串,否则将忽略它。如果未定义文本键,则不能使用行筛选和多行功能。json.overwrite_keys: false 若启用此设置,则解码的 JSON 对象中的值将覆盖 Filebeat 通常添加的字段(类型,源,偏移等)以防发生冲突。 |
multiline | 将多行日志合并成一行 示例: multiline.negate: false 包含(true)或排除(false)匹配上的行 multiline.pattern: ^\[ 匹配正则multiline.match: after 合并匹配之后(after)的行 |
tags | 在 Filebeat 输出的每个事件中加入这个 tags 字段使用标签,这样能够被 Kibana 或 Logstash 轻松过滤 示例: ["json"] |
fields | 可以向输出添加附加字段,例如可以加入一些字段过滤 log 数据 示例: level: debug |
1.3.2 paths 的使用
☞ 日志加载路径
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
☞ 多个输入部分
filebeat.inputs:
- type: log # 从 system.log、wifi.log 两个文件收集
paths:
- /var/log/system.log
- /var/log/wifi.log
- type: log # 从 apache2 下所有文件收集
paths:
- "/var/log/apache2/*"
- type: log # 抓取 /var/log 子目录目录下所有 *.log 文件,不会从 /var/log 本身目录下的 *.log 文件
paths:
- /var/log/*/*.log
1.3.3 收集 Java 多行日志
# https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
# 更改为 true 以启用此输入配置
enabled: true
# 应该爬行和获取的路径,基于全局的路径。
paths:
- /home/logs/*
# 合并以 "[" 开头的第一行之后的行
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["java"]
1.3.4 收集 JSON 格式日志
# https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
# 更改为 true 以启用此输入配置
enabled: true
# 应该爬行和获取的路径,基于全局的路径。
paths:
- /home/logs/*
# 解码 JSON,如果日志是 JSON 格式, 启用此功能
json.keys_under_root: true
json.overwrite_keys: true
tags: ["json"]
1.4 输出
1.4.1 Logstash 作为输出
☞ 配置 filebeat.yml
# https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
# 更改为 true 以启用此输入配置
enabled: true
# 应该爬行和获取的路径,基于全局的路径。
paths:
- /home/filebeat-7.10.2-linux-x86_64/logs/*
# ------------------------------ Logstash Output -------------------------------
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
☞ Logstash 配置文件
# 在 Logstash 安装目录下新建 first-pipeline.conf
# https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html
input {
# 使用 beats 输入插件
beats {
port => 5044
}
}
# https://www.elastic.co/guide/en/logstash/current/plugins-outputs-stdout.html
output {
# 输出到控制台
stdout {
codec => rubydebug
}
}
☞ 启动 Logstash
# --config 或 -f 选项的意思是指定配置文件启动
# --config.test_and_exit 选项的意思是解析配置文件并报告任何错误
# --config.reload.automatic 选项的意思是启用自动配置加载
bin/logstash -f first-pipeline.conf --config.test_and_exit
☞ 启动 Filebeat
# -e 将日志记录到标准日志并禁用系统日志/文件输出
# -c 指定你的配置文件, 默认读取 filebeat.yml 文件
# -d 参数指定了调试的选择器,不同的选择器用逗号分隔,-d "*" 表示调试所有的信息。
./filebeat -e -c filebeat.yml -d "publish"
如果一切正常,会在 Logstash 控制台看到类似下图的输出:
1.4.2 Elasticsearch 作为输出
☞ 配置 filebeat.yml
# https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
hosts: ["localhost:9200"]
# 无密码可不配
username: "USERNAME"
password: "PASSWORD"
# 配置索引库名称,默认 filebeat-%{[agent.version]}-%{+yyyy.MM.dd}-%{index_num}
# 要想使用必须设置 setup.template.name 和 setup.template.pattern
index: "filebeat-es-%{+yyyy.MM.dd}"
# ================================== Template ==================================
# 模板名称和模式必须设置,以防 Elasticsearch 索引模式被修改。
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
# 自定义 ES 的索引需要把索引生命周期管理 ilm 设置为 false
setup.ilm.enabled: false
☞ 启动
启动 Filebeat 后就可以发现,Elasticsearch 中多了一个名为 filebeat-es-2021.02.09
的索引,里面放了一堆看不懂的东西,就是我们刚刚通过 Filebeat 采集的日志。这个时候收集到的数据没有太大的意义,我们需要通过 Logstash 解析之后再存入 Elasticsearch 中。