利用 Filebeat 收集日志
Filebeat 是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理安装,Filebeat监视您指定 的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。
Logstash 也可以直接收集日志,但需要安装JDK并且会占用至少500M 以上的内存
生产一般使用filebeat代替logstash, 基于go开发,部署方便,重要的是只需要10M多内存,比较节约资源.
filebeat 支持从日志文件,Syslog,Redis,Docker,TCP,UDP,标准输入等读取数据,对数据做简单处理,再输 出至Elasticsearch,logstash,Redis,Kafka等
Filebeat的工作方式如下:
-
启动Filebeat时,它将启动一个或多个输入源,这些输入将在为日志数据指定的位置中查找。
-
对于Filebeat所找到的每个日志,Filebeat都会启动收集器harvester进程。
-
每个收集器harvester都读取一个日志以获取新内容,并将新日志数据发送到libbeat
-
libbeat会汇总事件并将汇总的数据发送到为Filebeat配置的输出。
Filebeat 官方说明
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
输入和输入官方说明
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html
注意: Filebeat 支持多个输入,但不支持同时有多个输出,如果多输出,会报错如下
Exiting: error unpacking config data: more than one namespace configured
accessing 'output' (source:'/etc/filebeat/stdout_file.yml')
安装 Filebeat 和配置说明
下载链接
安装 Filebeat
#新版下载
[root@elk-web1 ~]#wget
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/f/filebeat/filebeat-8.6.1-amd64.deb
#旧版下载
[root@elk-web1 ~]#wget
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/apt/pool/main/f/filebeat/filebeat-7.6.2-amd64.deb
#安装
[root@elk-web1 ~]#dpkg -i filebeat-7.6.2-amd64.deb
#默认没有启动
[root@elk-web1 ~]#systemctl enable --now filebeat
#filebeat以root身份启动
[root@elk-web1 ~]#systemctl start filebeatps aux|grep filebeat
#先停止服务,方便后续调试
[root@elk-web1 ~]#systemctl stop filebeat
Filebeat 配置
配置文件官方说明
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
https://www.elastic.co/guide/en/beats/filebeat/8.3/configuration-general-options.html
Filebeat的 默认配置文件是/etc/filebeat/filebeat.yml,遵循YAML语法。常见配置包括如下
-
Filebeat
-
Output
-
Shipper
-
Logging(可选)
-
Run Options(可选)
filebeat.yml的格式说明
input_type: log
#指定输入类型
paths
#支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log
encoding
#plain, latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312,euc-kr, euc-jp, iso-2022-jp, shift-jis, and so on
exclude_lines
#支持正则 排除匹配的行,如果有多行,合并成一个单一行来进行过滤
include_lines
#支持正则 include_lines执行完毕之后会执行exclude_lines。
exclude_files
#支持正则 排除匹配的文件
exclude_files: ['.gz$']
tags
#列表中添加标签,用过过滤
filebeat.inputs:
- paths: ["/var/log/app/*.json"]
tags: ["json"]
fields
#可选字段,选择额外的字段进行输出
#可以是标量值,元组,字典等嵌套类型
ignore_older
#可以指定Filebeat忽略指定时间段以外修改的日志内容
#文件被忽略之前,确保文件不在被读取,必须设置ignore older时间范围大于close_inactive
#如果一个文件正在读取时候被设置忽略,它会取得到close_inactive后关闭文件,然后文件被忽略
close_*
#close_ *配置选项用于在特定标准或时间之后关闭harvester。 关闭harvester意味着关闭文件处理程序。 如果在harvester关闭后文件被更新,则在scan_frequency过后,文件将被重新拾取。 但是,如果在harvester关闭时移动或删除文件,Filebeat将无法再次接收文件,并且harvester未读取的任何数据都将丢失。
close_inactive
#启动选项时,如果在制定时间没有被读取,将关闭文件句柄
#读取的最后一条日志定义为下一次读取的起始点,而不是基于文件的修改时间
#如果关闭的文件发生变化,一个新的harverster将在scan_frequency运行后被启动
#建议至少设置一个大于读取日志频率的值,配置多个prospector来实现针对不同更新速度的日志文件
#使用内部时间戳机制,来反映记录日志的读取,每次读取到最后一行日志时开始倒计时
#使用2h 5m 来表示
recursive_glob.enabled
#递归匹配日志文件,默认false
close_rename
#当选项启动,如果文件被重命名和移动,filebeat关闭文件的处理读取
close_removed
#当选项启动,文件被删除时,filebeat关闭文件的处理读取
#这个选项启动后,必须启动clean_removed
close_eof
#适合只写一次日志的文件,然后filebeat关闭文件的处理读取
close_timeout
#当选项启动时,filebeat会给每个harvester设置预定义时间,不管这个文件是否被读取,达到设定时间后,将被关闭
close_timeout 不能等于ignore_older,会导致文件更新时,不会被读取
#如果output一直没有输出日志事件,这个timeout是不会被启动的,至少要要有一个事件发送,然后haverter将被关闭
#设置0 表示不启动
clean_inactived
#从注册表文件中删除先前收获的文件的状态
#设置必须大于ignore_older+scan_frequency,以确保在文件仍在收集时没有删除任何状态
#配置选项有助于减小注册表文件的大小,特别是如果每天都生成大量的新文件
#此配置选项也可用于防止在Linux上重用inode的Filebeat问题
clean_removed
#启动选项后,如果文件在磁盘上找不到,将从注册表中清除filebeat
#如果关闭close removed 必须关闭clean removed
scan_frequency
#prospector检查指定用于收获的路径中的新文件的频率,默认10s
document_type
#类型事件,被用于设置输出文档的type字段,默认是log
harvester_buffer_size
#每次harvester读取文件缓冲字节数,默认是16384
max_bytes
#对于多行日志信息,很有用,最大字节数
json
#这些选项使Filebeat解码日志结构化为JSON消息,逐行进行解码json
keys_under_root
#设置key为输出文档的顶级目录
overwrite_keys
#覆盖其他字段
add_error_key
#定义一个json_error
message_key
#指定json 关键建作为过滤和多行设置,与之关联的值必须是string
multiline
#控制filebeat如何处理跨多行日志的选项,多行日志通常发生在java堆栈中
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
上面匹配是将多行日志所有不是以[符号开头的行合并成一行它可以将下面的多行日志进行合并成一行
multiline.pattern
指定匹配的正则表达式,filebeat支持的regexp模式与logstash支持的模式有所不同
pattern regexp
multiline.negate
定义上面的模式匹配条件的动作是 否定的,默认是false
假如模式匹配条件'^b',默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并
如果是true,表示将不以b开头的日志行进行合并
multiline.match
#指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negate
multiline.max_lines
#可以组合成一个事件的最大行数,超过将丢弃,默认500
multiline.timeout
#定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5s
tail_files
#如果此选项设置为true,Filebeat将在每个文件的末尾开始读取新文件,而不是开头
#此选项适用于Filebeat尚未处理的文件
symlinks
#符号链接选项允许Filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使为符号链接的路径,Filebeat也会打开并读取原始文件。
backoff
#backoff选项指定Filebeat如何积极地抓取新文件进行更新。默认1s
#backoff选项定义Filebeat在达到EOF之后再次检查文件之间等待的时间。
max_backoff
#在达到EOF之后再次检查文件之前Filebeat等待的最长时间
backoff_factor
#指定backoff尝试等待时间几次,默认是2
harvester_limit
#harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数
enabled
#控制prospector的启动和关闭
filebeat global
spool_size
#事件发送的阀值,超过阀值,强制刷新网络连接
filebeat.spool_size: 2048
publish_async
#异步发送事件,实验性功能
idle_timeout
#事件发送的超时时间,即使没有超过阀值,也会强制刷新网络连接
filebeat.idle_timeout: 5s
registry_file
#注册表文件的名称,如果使用相对路径,则被认为是相对于数据路径
#有关详细信息,请参阅目录布局部分 默认值为${path.data}/registry
filebeat.registry_file: registry
config_dir
#包含额外的prospector配置文件的目录的完整路径
#每个配置文件必须以.yml结尾
#每个配置文件也必须指定完整的Filebeat配置层次结构,即使只处理文件的prospector部分。
#所有全局选项(如spool_size)将被忽略
#必须是绝对路径
filebeat.config_dir: path/to/configs
shutdown_timeout
#Filebeat等待发布者在Filebeat关闭之前完成发送事件的时间。
Filebeat General
name
#设置名字,如果配置为空,则用该服务器的主机名
name: "my-shipper"
queue_size
#单个事件内部队列的长度 默认1000
bulk_queue_size
#批量事件内部队列的长度
max_procs
#设置最大使用cpu数量
范例:添加新字段
#默认配置文件中添加新字段
vim /etc/filebeat/filebeat.yml
- type : log
enabled: true
paths:
- /var/log/syslog
fields:
project: test-syslog #添加fields.project和fields.env字段,可用于区分不同的日志
env: test
tags: ["syslog","test"] #添加标签,也可以用于区分不同的日志
案例: 从标准输入读取再输出至标准输出
创建配置
[root@elk-web1 ~]#vim /etc/filebeat/stdin.yml
filebeat.inputs:
- type: stdin
enabled: true
#output.console:
# pretty: true
# enable: true
output.console:
pretty: true
enable: true
#语法检查
[root@ubuntu2204 ~]#filebeat test config -c stdin.yml
Config OK
执行读取
#从指定文件中读取配置
#-e 表示Log to stderr and disable syslog/file output
[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/stdin.yml
#下面命令默认就会从/etc/filebeat/目录中加载stdin.yml文件,而非当前目录
[root@elk-web1 ~]#filebeat -e -c stdin.yml
.....
hello,es #输入信后再回车,输出如下
案例: 从标准输入读取再输出至 Json 格式的文件
创建配置
[root@elk-web1 ~]#vim /etc/filebeat/stdout_file.yml
filebeat.inputs:
- type: stdin
enabled: true
json.keys_under_root: true #默认False会将json数据存储至message,true则会将数据以独立字段存储,并且删除message字段,如果是文本还是放在message字段中
output.file:
path: "/tmp"
filename: "filebeat.log"
执行读取
[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/stdout_file.yml
.....
#输入如下Json格式信息,再回车后输出如下
{"name" : "wangxiaochun", "age" : "18", "phone" : "0123456789"}
[root@elk-web1 ~]#cat /tmp/filebeat.log
#Json格式整理
[root@elk-web1 ~]#apt -y install jq
#8.X版本生成的文件名,json.keys_under_root: false
[root@elk-web1 ~]#cat /tmp/filebeat.log-20230217.ndjson |jq
#8.X版本生成的文件名,json.keys_under_root: true
[root@elk-web1 ~]#cat /tmp/filebeat.log-20230217-1.ndjson|jq
案例: 从文件读取再输出至标准输出
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.htmlhttps://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html filebeat 会将每个文件的读取数据的相关信息记录在/var/lib/filebeat/registry/filebeat/log.json文 件中,可以实现日志采集的持续性,而不会重复采集
创建配置
[root@elk-web1 ~]#vim /etc/filebeat/file.yml
filebeat.inputs:
- type: log
enabled: true
paths:
#- /var/log/syslog
- /var/log/test.log
output.console:
pretty: true
enable: true
执行读取
[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/file.yml
......
#执行生成文件内容后echo hello,wang > /var/log/test.log以看到下面的输出信息
#filebeat记录日志文件读取的当前位置,以防止重复读取日志
[root@ubuntu2204 ~]#cat /var/lib/filebeat/registry/filebeat/log.json
案例: 利用 Filebeat 收集系统日志到 ELasticsearch
Filebeat收集的日志在Elasticsearch中默认生成的索引名称为
#新版
.ds-filebeat-<版本>-<时间>-<ID>
#旧版
filebeat-<版本>-<时间>-<ID>
修改配置
插件查看索引
测试用ssh登录,用插件查看日志
注意:8.X版后索引名默认为.ds-filebeat--
新版
旧版
通过 Kibana 查看收集的日志信息
新版
-
数据视图
-
创建数据视图
旧版
-
管理
-
索引模式
-
创建索引模式
案例: 自定义索引名称收集日志到 ELasticsearch
修改配置
范例:自定义索引名称收集所有系统日志到 ELasticsearch
[root@elk-web1 ~]#vi /etc/rsyslog.conf
.....
*.* /var/log/system.log
[root@elk-web1 ~]#systemctl restart rsyslog
[root@elk-web1 ~]#vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true #开启日志
paths:- /var/log/system.log #指定收集的日志文件
include_lines: ['sshd','failed', 'password'] #只过滤指定包含关健字的日志
#include_lines: ['^ERR', '^WARN'] #只过滤指定包含关健字的日志
#exclude_lines: ['Debug'] #排除包含关健字的日志
#exclude_files: ['.gz$'] #排除文件名包含关健字的日志文件
output.elasticsearch:
hosts: ["10.0.0.101:9200"] #指定ES集群服务器地址和端口
index: "wang-%{[agent.version]}-%{+yyyy.MM.dd}" #自定义索引名称,agent.version是filebeat添加的元数据字段
#注意: 8.X版生成的索引名为 .ds-wang-%{[agent.version]}-日期-日期-00000n
#注意:如果自定义索引名称,没有添加下面三行的配置会导致filebeat无法启动,提示错误日志如下
filebeat:Exiting: setup.template .name and setup.template .pattern have to be
set if index name is modifiedsystemd: filebeat.service: main process exited,
code=exited,status=1/FAILURE
setup.ilm.enabled: false #关闭索引生命周期ilm功能,默认开启时索引名称只能为filebeat-*,自定义索引名必须修改为false
setup.template.name: "wang" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.pattern: "wang-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.settings:
index.number_of_shards: 3
index.number_of_replicas: 1
默认情况下 Filebeat 写入到 ES 的索引分片为1,副本数为1,如果需要修改分片和副本数,可以通过如 下实现
#方法1,修改filebeat.yml配置文件,此方式只适合直接连接ES时才有效,适用度不高
#注意:如果模板已经存在,需要先删除模板和索引才能生效,利用kibana或者cerebro(8.X不支持)插件
(more--index templates--existing templates--输入搜索的模板名wang)
vim /etc/filebeat/filebeat.yml
setup.template.settings:
index.number_of_shards: 3
index.number_of_replicas: 1
#生效后,在cerebro插件中more--index templates--existing templates--输入搜索的模板名
wang 中可以看到以下的分片和副本配置,8.X不支持
#settings中number_of_shards和number_of_replication
#方法2:也可以通过修下面方式修改,8.X不支持
1.停止filebeat服务
2.在cerebro web页面修改:修改模板settings 配置,调整分片以及副本
3.删除模板关联的索引
4.启动filebeat产生新的索引
范例: 自定义索引名称收集Nginx日志到 ELasticsearch
[root@elk-web1 ~]#apt update && apt -y install nginx
[root@elk-web1 ~]#vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true #开启日志
paths:
- /var/log/nginx/access.log #指定收集的日志文件
output.elasticsearch:
hosts: ["10.0.0.101:9200"] #指定ES集群服务器地址和端口
index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}" #自定义索引名称
setup.ilm.enabled: false
setup.template.name: "nginx" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.pattern: "nginx-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动
启动服务
[root@elk-web1 ~]#systemctl enable --now filebeat.service