本文使用filebeat 6.8,使用yum安装,不同版本命令或配置可能不一样,自行鉴别
官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/index.html
介绍
filebeat是一款轻量级的日志收集工具,是Beats套件之一,它将收集的日志转发输出到elasticsearch、logstash等后端。
工作原理:
更详细的的介绍可以参考:https://blog.csdn.net/hwjcmozw/article/details/109473925
命令行参数
子命令
enroll 注册到kibana集中管理
export 导出当前配置或模版
help 显示帮助
keystore 管理密钥
modules 管理模块
run 运行filebeat
setup 设置初始环境,包括索引模板,Kibana仪表板(如果可用)和机器学习作业(如果可用)。
test 测试配置文件
version 查看版本
查看版本
$ filebeat version
filebeat version 6.8.22 (amd64), libbeat 6.8.22 [24dac6020020a7333d4665b5dca5018e63f2dce5 built 2021-12-18 23:54:48 +0000 UTC]
测试配置文件
filebeat test config -c /etc/filebeat/filebeat.yml # 测试配置文件
filebeat test output -c /etc/filebeat/filebeat.yml # 测试output
模块管理
默认模块目录:/etc/filebeat/modules.d
filebeat modules list # 列出当前模块,开启或关闭情况
filebeat modules enable xxxx xxxx # 开启模块
filebeat modules disable xxxx xxxx # 关闭模块
默认开启模块,会按照预设路径采集日志,如果需要自定义采集日志路径,需要修改模块的yml配置。以mysql.yml为例,编译安装后的mysql,需要修改错误日志和慢日志路径(var.paths)才能采集到:
- module: mysql
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/data/mysql/mysql_master/data/mysql_error.log"]
# Slow logs
slowlog:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/data/mysql/mysql_master/data/slowquery.log"]
使用命令行来覆盖变量:
./filebeat -e -M "nginx.access.var.paths=[/usr/local/var/log/nginx/access.log*]"
通过配置文件来定义开启的模块:
filebeat.modules:
- module: nginx
- module: mysql
- module: system
初始化setup
初始化dashboard需要配置/etc/filebeat/filebeat.yml
中的setup.kibana
初始化索引需要配置/etc/filebeat/filebeat.yml
中的output.elasticsearch
添加配置后,命令行使用setup初始化:
$ filebeat setup
Loaded index template
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Loaded machine learning job configurations
Loaded Ingest pipelines
也可以使用以下子命令限制setup的范围:
--dashboards Setup dashboards
--ilm-policy Setup ILM policy
--machine-learning Setup machine learning job configurations
--modules string List of enabled modules (comma separated)
--pipelines Setup Ingest pipelines
--template Setup index template
储存密钥keystore
keystore
主要是防止敏感信息被泄露,比如密码等,像ES的密码,这里可以生成一个key为ES_PWD
,值为es的password的一个对应关系,在使用es的密码的时候就可以使用${ES_PWD}
引用
$ filebeat keystore create # 创建keystore
$ filebeat keystore add ES_PWD # 添加一个名为ES_PWD的secret
Enter value for ES_PWD: ******
Successfully updated the keystore
$ filebeat keystore list # 列出当前的key
ES_PWD
$ filebeat keystore remove ES_PWD # 移除secret
定义好key和secret后,可以在配置文件中使用${ES_PWD}
引用这个值。例如:
output.elasticsearch.password:"${ES_PWD}"
run运行
使用-e
参数,把日志重定向到屏幕输出
filebeat run -c /etc/filebeat/filebeat.yml -e
导出export
输出当前配置
filebeat export config -c /etc/filebeat/filebeat.yml
输出模版信息
filebeat export template -c /etc/filebeat/filebeat.yml
配置文件
filebeat的配置文件,最简单的配置就是输入和输出,但是想要灵活的运用它来采集日志和输出到不同的后端,就需要更加细致的配置。
input配置
可选的输入类型:
这里只展开记录一下最常用的log
输入类型,其它请查阅官方文档。
log
采用日志文件的形式作为输入,简单的例子:
filebeat.inputs:
- type: log
paths:
- /var/log/system.log
- /var/log/wifi.log
- type: log
paths:
- "/var/log/apache2/*"
fields:
apache: true
fields_under_root: true
paths
表示日志的文件路径,可以使用通配符*
来匹配文件。
fields
表示向输出添加附加信息的自定义字段,这里采集apache日志添加了apache:true
标记字段。
fields_under_root
表示将自定义字段存储为顶级字段,设置前后效果如下图:
常用参数tags
打多个标签,便于搜索
enabled
使用该enabled
选项启用和禁用输入。默认情况下,启用设置为真。
exclude_lines
排除匹配的正则表达式列表
include_lines
包含匹配的正则表达式列表
exclude_files
忽略的文件匹配的正则表达式列表。默认情况下不排除任何文件。
harvester_buffer_size
每个收集器在获取文件时使用的缓冲区大小(以字节为单位)。默认值为 16384。
tail_files
未记录在register的,从最后一行开始记录。(适合新部署filebeat,系统已经存在大量数据的情况,避免把所有已经存在的数据全部录入,开启该设置,等register文件记录好了旧文件的offest位置后可以去掉。)
max_bytes
单个日志消息可以拥有的最大字节数。之后的所有字节
max_bytes
都被丢弃而不发送。此设置对于可能变得很大的多行日志消息特别有用。默认值为 10MB (10485760)。
ignore_older
如果启用此选项,Filebeat 将忽略在指定时间跨度之前修改的所有文件。
其它参数比较少用到,完整参数可以参考官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/filebeat-input-log.html
匹配多行输入
filebeat默认读取日志文件以单行作为一个日志信息单元,比如java的堆栈日志,需要使用multiline
参数来匹配。官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/multiline-examples.html
例子:
匹配以日期开头的日志,使用日期作为多行日志的断行依据(以下例子日期匹配正则不精确,仅作例子)
- type: log
paths:
- /data/server/logs/*.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: "5s"
multiline.max_lines: 500
结果:
官方还提供了一个测试正则的脚本:https://go.dev/play/p/uAd5XHxscu
扩展配置
扩展input
filebeat.config.inputs:
enabled: true
path: configs/*.yml
扩展modules
filebeat.config.modules:
enabled: true
path: ${path.config}/modules.d/*.yml
可以添加reload
参数来实现定时重新加载
filebeat.config.inputs:
enabled: true
path: configs/*.yml
reload.enabled: true
reload.period: 10s
output配置
可选output:
输出到elasticsearch
官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/elasticsearch-output.html
配置样例:
output.elasticsearch:
hosts: ["https://localhost:9200"]
index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"
ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
ssl.certificate: "/etc/pki/client/cert.pem"
ssl.key: "/etc/pki/client/cert.key"
username: "filebeat_internal"
password: "YOUR_PASSWORD"
常用参数compression_level
压缩等级,可选0-9,默认为0表示不开启压缩,最高为9压缩等级最高,开启压缩可以减少带宽,但是会增加性能开销。
escape_html
跳过html转义,默认为true
worker
并发数,默认为1
proxy_url
代理url
index
索引,默认为filebeat-%{[beat.version]}-%{+yyyy.MM.dd}
indices
多个索引
output.elasticsearch:
hosts: ["http://localhost:9200"]
indices:
- index: "warning-%{[beat.version]}-%{+yyyy.MM.dd}"
when.contains:
message: "WARN"
- index: "error-%{[beat.version]}-%{+yyyy.MM.dd}"
when.contains:
message: "ERR"
output.elasticsearch:
hosts: ["http://localhost:9200"]
indices:
- index: "%{[fields.log_type]}"
mappings:
critical: "sev1"
normal: "sev2"
default: "sev3"
输出到logstash
官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/logstash-output.html
output.logstash:
hosts: ["127.0.0.1:5044"]
常用参数
compression_level
压缩等级,可选0-9,默认为0表示不开启压缩,最高为9压缩等级最高,开启压缩可以减少带宽,但是会增加性能开销。
escape_html
跳过html转义,默认为true
index
索引
proxy_url
代理url
loadbalance
负载,默认为false
,需要多个hosts
输出到kafka
官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.8/kafka-output.html
output.kafka:
# initial brokers for reading cluster metadata
hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]
# message topic selection + partitioning
topic: '%{[fields.log_topic]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
输出到redis
output.redis:
hosts: ["localhost"]
password: "my_password"
key: "filebeat"
db: 0
timeout: 5
通过keys分类
根据内容分类
当message
内容包含INFO
字符串,发送到info_list
,当message
内容包含DEBUG
字符串,发送到debug_list
,匹配不到发送到默认default_list
。
output.redis:
hosts: ["localhost"]
key: "default_list"
keys:
- key: "info_list" # send to info_list if `message` field contains INFO
when.contains:
message: "INFO"
- key: "debug_list" # send to debug_list if `message` field contains DEBUG
when.contains:
message: "DEBUG"
根据值分类
当fileset.module
为system
,发送到system_log
,以此类推。
output.redis:
hosts: ["localhost"]
key: "default_log"
keys:
- key: "%{[fileset.module]}"
mappings:
system: "system_log"
elasticsearch: "elasticsearch_log"
auditd: "auditd_log"
输出到文件
output.file:
path: "/tmp/filebeat"
filename: filebeat
#rotate_every_kb: 10000
#number_of_files: 7
#permissions: 0600
输出到终端
output.console:
pretty: true