filebeat应用
目前以7.x版本为例
安装
CentOS 7yum安装
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
cat > /etc/yum.repos.d/elastic.repo << EOF
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install filebeat -yfilebeat配置
filebeat.yml 基础配置示例:
单索引配置示例
# 防止重启后从头读取日志文件,必须指定path.data路径,并将该路径挂载到一个不会被删除的位置
path.data: /usr/share/filebeat/data
filebeat.inputs:
- type: filestream
id: my-filestream-id
enabled: true
paths:
- /var/log/*.log
- /var/log/*/*
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
output.elasticsearch.index: "index_name-%{+yyyy.MM.dd}"
# setup.ilm.enabled项配置为false,上面的‘output.elasticsearch.index’自定义内容才会生效
# 否则到es中查询索引只会有filebeat
setup.ilm.enabled: false
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
output.elasticsearch:
hosts: ["127.0.0.1:9200"]
protocol: "http"
username: "elastic"
password: "changeme"
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~多索引配置示例
# 防止重启后从头读取日志文件,必须指定path.data路径,并将该路径挂载到一个不会被删除的位置
path.data: /usr/share/filebeat/data
filebeat.inputs:
- type: filestream
id: test-nginx
enabled: true
paths:
- /usr/local/tomcat/logs/access.log
tags: ["nginx_access"]
- type: filestream
id: test-nginx-error
enabled: true
paths:
- /usr/local/tomcat/logs/error.log
tags: ["nginx_error"]
setup.template.enabled: false
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.template.overwrite: false
#output.elasticsearch.index: "index_name-%{+yyyy.MM.dd}"
# setup.ilm.enabled项配置为false,上面的‘output.elasticsearch.index’自定义内容才会生效
# 否则到es中查询索引只会有filebeat
setup.ilm.enabled: false
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 0
setup.kibana:
output.elasticsearch:
hosts: ["127.0.0.1:9200"]
protocol: "http"
username: "elastic"
password: "passwd"
indices:
- index: "nginx-access-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_access"
- index: "nginx-error-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_error"
processors:
- add_id: ~
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~动态加载配置示例
有时候要修改filebeat的采集配置,但大部分情况下配置要重启服务才会生效。filebeat可以配置动态加载配置,在指定的时间内自动扫描配置文件的变化进行重新加载。不过动态加载对于filebeat.yml文件不生效 filebeat.yml内容示例
# 防止重启后从头读取日志文件,必须指定path.data路径,并将该路径挂载到一个不会被删除的位置
path.data: /usr/share/filebeat/data
filebeat.config.inputs:
enabled: true
path: configs/*.yml
reload.enabled: true
reload.period: 10s
setup.template.enabled: false
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.template.overwrite: false
#output.elasticsearch.index: "index_name-%{+yyyy.MM.dd}"
# setup.ilm.enabled项配置为false,上面的‘output.elasticsearch.index’自定义内容才会生效
# 否则到es中查询索引只会有filebeat
setup.ilm.enabled: false
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 0
setup.kibana:
output.elasticsearch:
hosts: ["127.0.0.1:9200"]
protocol: "http"
username: "elastic"
password: "passwd"
indices:
- index: "nginx-access-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_access"
- index: "nginx-error-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_error"
processors:
- add_id: ~
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~input.yml内容示例
- type: filestream
id: test-nginx
enabled: true
paths:
- /usr/local/tomcat/logs/access.log
tags: ["nginx_access"]
scan_frequency: 10s
- type: filestream
id: test-nginx-error
enabled: true
paths:
- /usr/local/tomcat/logs/error.log
tags: ["nginx_error"]
scan_frequency: 10sNginx日志解析配置
filebeat同样支持通过Grok正则解析WEB服务日志,解析操作在processors中通过dissect进行,以下是配置示例
processors:
- dissect:
tokenizer: "%{IPV4:ream_addr} %{USER:ident} %{USER:auth} [%{HTTPDATE:timestamp}] \"%{WORD:http_method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{DATA:http_host} %{NUMBER:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{IP:client_ip}\""
field: "message"
target_prefix: "nginx_access"
- add_id: ~
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~多行日志处理
java项目中经常遇到错误日志是由多行组成,如果按行收集,会导致日志被分割,不方便排查问题。
multiline.type 定义要使用的聚合方法。默认为"."。还可以指定pattern count 为按指定的行数进行聚合
multiline.pattern 指定要匹配的正则表达式。
multiline.negate 定义是否否定模式。默认值为 false
multiline.match 指定如何将匹配的行合并到事件中。after或before
negat的设置
match的设置
结果
示例 pattern: ^b
false
after
与模式匹配的连续行将追加到不匹配的前一行
![[../../../media/Images/filebeat_01.png]]
false
before
与模式匹配的连续行将附加到不匹配的下一行
![[../../../media/Images/filebeat_02.png]]
true
after
与模式不匹配的连接行将追加到匹配的上一行
![[../../../media/Images/filebeat_03.png]]
true
before
与模式不匹配的连续行将附加到匹配的下一行
![[../../../media/Images/filebeat_04.png]]
multiline.flush_pattern 指定一个正则表达式,在该表达式中,当前多行将从内存中刷新,结束多选消息
multiline.max_lines 可以组合到一个事件中的最大行数。默认值为500。
multiline.timeout 在指定的时间后,Filebeat将发送多行事件,即使没有找到新模式来启动新事件,默认值为5秒。
multiline.count_lines 要聚合到单个事件的行数。
multiline.skip_newline 设置后,多行事件在在没有行分隔符的情况下串联。
多行配置示例(7.x版本)
本节中的示例涵盖以下用例:
将 Java 堆栈跟踪合并为单个事件
将 C 样式的线条延续合并到单个事件中
合并来自时间戳事件的多行
在版本为7的filebeat中,想要多行合并生效,filebeat.inputs中的type不能设置为filestreamfilebeat.yml配置示例
filebeat.inputs:
- type: log
paths:
- /app/logs/*
multiline.pattern: '^[[:space:]]+'
multiline.negate: false
multiline.match: after
multiline.max_lines: 500
setup.template.name: "multiline"
setup.template.pattern: "multiline"
output.elasticsearch.index: "index-name-%{+yyyy.MM}"
output.elasticsearch:
hosts: ["https://172.23.100.51:9200", "https://172.23.100.52:9200", "https://172.23.100.53:9200"]
username: "elastic"
password: "passwd"
protocol: "https"
ssl.certificate_authorities: ["/etc/es_ca.pem"]Java堆栈跟踪
Java 堆栈跟踪由多行组成,初始行之后的每一行都以空格开头,如 此示例:
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)Filebeat合并为一行配置示例: 此配置将任何以空格开头的行合并到前一行。
multiline.type: pattern
multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after下面是一个 Java 堆栈跟踪,它提供了一个稍微复杂的示例:
Exception in thread "main" java.lang.IllegalStateException: A book has a null property
at com.example.myproject.Author.getBookIds(Author.java:38)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
at com.example.myproject.Book.getId(Book.java:22)
at com.example.myproject.Author.getBookIds(Author.java:35)
... 1 moreFilebeat合并为一行配置示例: 在此示例中,模式与以下行匹配:
以空格开头的行,后跟单词 orat…
以单词开头的行Caused by:
multiline.type: pattern
multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:'
multiline.negate: false
multiline.match: after行延续
一些编程语言在行尾使用反斜杠\字符来表示行的继续,例如
printf ("%10.10ld \t %10.10ld \t %s\
%f", w, x, y, z );要在Filebeat中将这些行合并为单一事件,配置示例如下: 此配置将以\字符结尾的任何行与后面的行合并。
multiline.type: pattern
multiline.pattern: '\\$'
multiline.negate: false
multiline.match: before时间戳
来自Elasticsearch等服务的活动日志通常以时间戳开头,后面跟有关的特定活动信息。例如
[2015-08-24 11:49:14,389][INFO ][env ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]要在Filebeat中将这些行合并为单个事件,示例配置:
multiline.type: pattern
multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after应用程序事件
有时,应用程序日志包含以自定义标记开头和结尾的事件,例如:
[2015-08-24 11:49:14,389] Start new event
[2015-08-24 11:49:14,395] Content of processing something
[2015-08-24 11:49:14,399] End event要在Filebeat中将这些行合并为单个事件,示例配置:
multiline.type: pattern
multiline.pattern: 'Start new event'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: 'End event'如果开始/结束日志块与非多行日志混合,或者不同的开始/结束日志块彼此重叠,则此示例将无法正常工作。以下日志只会全部合并到一个单行事件中。因为它们既不匹配multiline.pattern,也不匹配multiline.flush_pattern
并且multiline.negate设置为true。示例
[2015-08-24 11:49:14,389] Start new event
[2015-08-24 11:49:14,395] Content of processing something
[2015-08-24 11:49:14,399] End event
[2015-08-24 11:50:14,389] Some other log
[2015-08-24 11:50:14,395] Some other log
[2015-08-24 11:50:14,399] Some other log
[2015-08-24 11:51:14,389] Start new event
[2015-08-24 11:51:14,395] Content of processing something
[2015-08-24 11:51:14,399] End event多行配置示例(8.x版本)
在8.x以上的版本,filebeat的input.type中不再推荐使用log,官方8.13版本文档参考
将 Java 堆栈跟踪合并为单个事件
filesteam配置多行示例
parsers:
- multiline:
type: pattern
pattern: '^[[:space:]]'
negate: false
match: afterlog配置多行示例对比
multiline.type: pattern
multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after服务控制
systemctl start|stop|status|restart filebeat错误处理
ERROR [elasticsearch] elasticsearch/client.go:226 failed to perform any bulk index operations: 413 Request Entity Too Large:找到filebeat的主配置filebeat.yml,在output中加入 bulk_max_size: 20,这个值默认是50,我们要改小一点,改成10或者20都行
……
output.elasticsearch:
hosts: ["172.23.1.2:9200"]
bulk_max_size: 20
bulk_max_bytes: 10485760
protocol: "http"
……filebeat数据流(data stream)配置
ES 7.9以后的版本支持数据流,数据流通过索引模板(index template)和 Index Lifecycle Management (ILM) 进行管理。索引模板定义了索引的设置和映射,ILM 定义了索引的生命周期管理策略(如何时滚动、何时删除)。
最后更新于