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 -y

filebeat配置

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: 10s

Nginx日志解析配置

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不能设置为filestream

filebeat.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 more

Filebeat合并为一行配置示例: 在此示例中,模式与以下行匹配:

  • 以空格开头的行,后跟单词 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: after

log配置多行示例对比

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 定义了索引的生命周期管理策略(如何时滚动、何时删除)。

最后更新于