ELK之filebeat详解

  • A+
所属分类:elk

一、什么是beats

beats轻量级数据收集器并将收集的数据转发给Logstash或Elasticserach。

Beats Platform

Beats分成以下几个种类:

  • Packetbeat: 网络流量监控采集
  • Filebeat: 文件log的监控采集
  • winlogbeat: 用于Windows系统的log监控采集
  • Topbeat: 类似于top命令,用来收集CPU、内存、进程等统计信息。
  • 可以使用go语言借助libbeat库开发自己的Beat工具。

在这里我们将主要介绍filebeat这个组件。

二、什么是filebeat

fielbeat是基于logstash-forwarder的源码改造而来,换句话说:filebeat就是最新版的logstash-forwarder。他负责从当前服务器获取日志然后转发给Logstash或Elasticserach进行处理。

Beats design

FileBeat如何工作:

filebeat包含两个部分prospectors和harversters。 一个是负责从文件中收集日志;一个负责管理harversters.

Image result for filebeat

什么是Harverster:

harverster负责读取文本文件,一行一行的读并将读到的内容发送到输出。harverster也负责打开和关闭文件,这就意味着只要harvester在运行时文件描述符将会一直被打开;如果一个文件被删除或者被重命名当harvester运行时,Filebeat会继续读取这个文件,然而,这是有副作用的在磁盘的空间上。默认情况下,filebeat会一直读取文件直到接收到close_inactive.

关闭一个harvester有以下后果:

  • 文件处理程序关闭,放潜在的资源。
  • 运行scan_frequency之后文件收集程序才能开始
  • 当harvester关闭的时候,如果文件被删除或重命名;将不会继续收集数据。

什么是Prospector:   负责管理harvesters和发现可读的资源

filebeat当前支持两种prospector类型:log和stdin.每一个prospector类型可以被定义多次。log类型prospector检查每个文件的harverster是否启动、运行或者此文件是否被忽略;新的文件是否发生改变当harvester关闭时。

Filebeat如何保持文件状态:

filebeat保存每个文件的状态并且快速的刷新此状态到注册表文件中。这个状态记录一个harvester读取到哪一行并确定所有的日志行被发送。如果是输出,例如Elastisearch或Logstash不可达时,filebeat将继续追踪最后一行而且只要output只要上线就继续读取此文件。当filebeat运行时,这个状态信息一直被保存在每一个prospector的内存中。当filebeat重启时,注册表中的数据用于重新建立状态,filebeat将继续每个harvester在已知的位置。

每一个prospector都会保存一个状态对它发现的文件,因为文件可能会被删除或者重命名,文件名和路径都不能够唯一表示一个文件,对于每个文件,filebeat存储一个唯一标识符来识别此文件。

 

Filebeat如何确保至少一次传送:

filebeat确保每个事件都会被传递到在配置文件中定义的输出至少一次并且没有数据丢失,因为filebeat会保存每个传递状态在注册表文件中。如果输出发生阻塞,filebeat不会确认所有事件,并且会继续传递这些事件知道输出确定他们接受到这些事件。

当开启一个传送事件后如果filebeat关闭,filebeat不会等待输出确认所有的事件在关闭之前;任何事件都会被重新发送一遍当filebeat重启时,这件确保每个事件至少被发送一次,当时你可以结束这个副本事件在开始发送之前。你也可以配置filebeat等待关闭时间使用shutdown_timeout选项。

注:这是一个限制对于filebeat至少传送一次包括日志轮转和删除的旧的文件。如果日志写入磁盘轮转的速度快于filebeat处理的速度或者文件被删除当输出不可达时,数据可能会丢失。在Linux中,filebeat非常可能跳过此行由于inode重用。

三、filebeat的安装和配置

rpm -vi filebeat-5.2.0-x86_64.rpm  #直接下载后安装即可,非常简单

配置:

filebeat的配置文件分为多段,不过大多可以使用默认配置,我们只需要更改这几需要的部分就行了~

filebeat配置Prospectors:

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/apache/httpd-*.log
  document_type: apache

- input_type: log
  paths:
    - /var/log/messages
    - /var/log/*.log

每一个prospectors项都以-开头。

input_type: 输入类型,log和stdin 默认为log.

document_type: 日志类型,默认是log,可以自定义,比如Nginx-log apache-log.

paths: 搜索文件的路径,以-开头。

encoding: 指定监控的文件编码类型

exclude_lines: 被filebeat排除的行,默认收集所有行。

include_lines: 被导出的行,默认所有行别导出。 如果exclude_lines和include_lines同时使用,先匹配include_lines后匹配

 

filebeat 全局配置文件:

spool_size: 这是一个阈值,spooler中的事件数超过这个阈值就会发送到输出无论是否达到超时时间。

idle_timeout: spooler的超时时间,达到此时间后,spooler会发送到输出,无论spool_size是否叨叨阈值。

registry_file: 记录filebeat的registry文件的位置。

shutdown_timeout:在发生数据输出时,等待多久去关闭filebeat.

 

 

 

Filebeat提供了几种不同的方式来启用模块:

  • modules.d编辑目录中启用模块配置
  • 运行Filebeat 编辑时启用模块
  • filebeat.yml文件编辑中启用模块配置

例如,要在 目录中启用apache2mysql配置modules.d,请使用:

1
./filebeat modules enable apache2 mysql

然后,当您运行Filebeat时,会加载modules.d目录中指定的相应模块配置

要查看启用和禁用模块的列表,请运行:

1
./filebeat modules list

要在命令行运行Filebeat时启用特定的模块,可以使用该--modules标志。

1
./filebeat -e --modules nginx,mysql,system

要启用filebeat.yml配置文件中的特定模块,可以将条目添加到filebeat.modules列表中。

1
2
3
4
filebeat.modules:
-  module:nginx
-  module:mysql
-  module:system

配置文件中的变量:

每个模块和文件集都有变量,您可以设置这些变量来更改模块的默认行为,包括模块查找日志文件的路径。

1
2
3
- module: nginx
  access:
    var.paths: ["/var/log/nginx/access.log*"#示例中的设置将设置nginx访问日志文件的路径
1
./filebeat -M“nginx.access.var.paths = [/ var / log / nginx / access.log *]” #在命令行设置变量时,变量名称需要包含模块和文件集名称。您可以指定多个覆盖。每个覆盖必须以-M
1
./filebeat --modules nginx -M "nginx.access.var.paths=[/var/log/nginx/access.log*]" -M "nginx.error.var.paths=[/var/log/nginx/error.log*]"#完整例子

测试配置文件是否有效:

1
./filebeat -e -c filebeat.yml -configtest -d "publish"  #可以测试您的配置文件以验证结构是否有效

如果您需要在YAML文件中指定正则表达式,最好将正则表达式包装在单引号中

如果09在数值字段中使用前导零(例如,)而不用单引号包装值,那么YAML解析器可能会错误地解释该值。

如果该值是有效的八进制数,则将其转换为整数。如果不是,则转换为浮点数。

Filebeat使用探勘器来定位和处理文件

可以filebeat.prospectorsfilebeat.yml配置文件的部分 指定一个探测器列表。

1
2
3
4
5
6
7
8
9
filebeat.prospectors:
type: log
  paths:
    /var/log/apache/httpd-*.log
type: log
  paths:
    /var/log/messages
    /var/log/*.log

选项配置:

  • log:读取日志文件的每一行(默认)。
  • stdin:读入标准
  • redis:从redis中读取慢日志条目(实验性)。
  • udp:通过UDP读取事件。 max_message_size
  • docker:从Docker中读取日志。 containers
path
应该被抓取和抓取的基于全局路径的列表可以使用以下模式:/var/log/*/*.log
recursive_glob.enabled
启用扩展**到递归全局模式。启用此功能后,**每个路径中的最右边将扩展为固定数量的全局模式。例如:/foo/**扩展到/foo/foo/*,/foo/*/*。此功能默认启用,设置recursive_glob.enabled为false将其禁用
encoding
以下是W3C推荐的一些示例编码:
utf-16be,utf-16be,big5,gb18030,gbk,hz-gb-2312,euc-kr,euc-jp,iso-2022-jp,shift-jis等等
exclude_lines
正则表达式的列表,以匹配您希望Filebeat排除的行。Filebeat删除与列表中正则表达式匹配的所有行。
    filebeat.prospectors:
    - paths:
        /var/log/myapp/*.log
      exclude_lines: ['^DBG']   
include_lines
正则表达式的列表,以匹配您希望Filebeat包含的行。Filebeat仅导出与列表中正则表达式匹配的行。
    filebeat.prospectors:
    - paths:
        /var/log/myapp/*.log
      include_lines: ['^ERR''^WARN']
exclude_files
正则表达式的列表,以匹配您希望Filebeat忽略的文件。
    exclude_files:['\ .gz $']
tags
Beat包含在tags每个发布事件的字段中的标签列表。标签可以很容易地在Kibana中选择特定的事件,或者在Logstash中应用条件过滤。这些标签将被追加到一般配置中指定的标签列表中。
    filebeat.prospectors:
    - paths: ["/var/log/app/*.json"]
      tags: ["json"]
fields
您可以指定的可选字段将其他信息添加到输出。例如,您可以添加可用于过滤日志数据的字段。字段可以是标量值,数组,字典或这些的任何嵌套组合。
    filebeat.prospectors:
    - paths: ["/var/log/app/*.log"]
      fields:
        app_id: query_engine_12
fields_under_root
如果此选项设置为true,则自定义字段将作为顶级字段存储在输出文档中,而不是在fields子字典下进行分组 。如果自定义字段名称与由Filebeat添加的其他字段名称冲突,则自定义字段会覆盖其他字段。
processors
要应用于探矿者生成的数据的处理器列表。
ignore_older
如果启用此选项,Filebeat将忽略在指定时间范围之前修改的任何文件。
close_*
的close_*配置选项用于之后的某一标准或时间以关闭收割机。关闭收割机意味着关闭文件处理程序。如果在收割机关闭后文件被更新,文件将在scan_frequency经过之后再被拾取。
close_inactive
启用此选项时,Filebeat将关闭文件句柄(如果文件尚未在指定的时间内收获)。例如,如果您的日志文件每隔几秒更新一次,则可以安全地设置close_inactive为1m。如果存在具有完全不同更新速率的日志文件,则可以使用具有不同值的多个探测器配置。
close_renamed
启用此选项时,文件重命名时Filebeat会关闭文件处理程序。例如,在旋转文件时发生这种情况。默认情况下,采集器保持打开状态并持续读取文件,因为文件处理程序不依赖于文件名。如果close_renamed启用该选项,并且文件被重命名或移动的方式不再与为探矿者指定的文件模式匹配,则文件将不会被再次拾取。Filebeat不会完成读取文件。
clean_removed
启用此选项后,Filebeat会在删除文件时关闭收割机。通常情况下,文件只能在指定的时间内无效后才能被删除close_inactive。但是,如果文件被提前删除,而您没有启用close_removed,Filebeat会保持打开文件以确保收割机已经完成。如果此设置导致文件因磁盘太早从磁盘中删除而未完全读取,请禁用此选项。
close_eof
启用此选项后,Filebeat会在文件结束时立即关闭文件。当您的文件只写入一次而不是不时更新时,这非常有用。例如,当您将每个日志事件写入新文件时,都会发生这种情况。该选项默认是禁用的。
close_timeout
该选项在输出被阻塞的情况下特别有用,这使得Filebeat即使对于从磁盘中删除的文件也保持打开的文件处理程序。设置close_timeout为5m确保文件定期关闭,以便操作系统释放它们。
clean_*
这些clean_*选项用于清理注册表文件中的状态条目。这些设置有助于减小注册表文件的大小,并可以防止潜在的inode重用问题。
clean_inactive
启用此选项后,Filebeat会在指定的非活动时间段过去后移除文件的状态。如果文件已被Filebeat忽略(文件比文件早ignore_older),则只能删除状态。该clean_inactive设置必须大于ignore_older + scan_frequency在收集文件时确保没有状态被删除。否则,该设置可能会导致Filebeat不断重新发送完整内容,因为它将clean_inactive删除探测器 仍然检测到的文件的状态。如果文件更新或再次出现,则从头开始读取文件。
clean_removed
启用此选项后,Filebeat将清除注册表中的文件(如果在最后一个已知名称下不能在磁盘上找到)。这意味着收割机完成后重命名的文件将被删除。该选项默认启用。
scan_frequency
探矿者在指定收获的路径中检查新文件的频率。例如,如果您指定一个glob /var/log/*,则使用指定的频率扫描目录中的文件 scan_frequency。指定1以尽可能频繁地扫描目录,而不会导致Filebeat过于频繁地扫描。我们不建议设置此值<1s。
harvester_buffer_sizeedit
每个采集器在获取文件时使用的缓冲区的大小(以字节为单位)。默认是16384
max_bytes
单个日志消息可以拥有的最大字节数。之后的所有字节max_bytes被丢弃并且不被发送。此设置对于可能变大的多行日志消息特别有用。默认值是10MB(10485760)。
json
这些选项使得Filebeat能够解码构造为JSON消息的日志。Filebeat逐行处理日志,所以JSON解码只在每行有一个JSON对象时才起作用。
json.keys_under_root:true
json.add_error_key:true
json.message_key:log
keys_under_root
默认情况下,解码后的JSON放在输出文档中的“json”键       
下。如果启用此设置,则会将键复制到输出文档的顶层。默认值是false
overwrite_keys
如果keys_under_root启用此设置,那么来自解码的JSON对象的值会覆盖Filebeat通常添加的字段(类型,源,偏移量等)以防冲突。
add_error_key
如果启用此设置,则在出现JSON解组错误或者message_key在配置中定义了a 但不能使用的情况下,Filebeat将添加“error.message”和“error.type:json”键。
message_key
一个可选的配置设置,用于指定应用行筛选和多行设置的JSON密钥。如果指定,键必须位于JSON对象的顶层,并且与键关联的值必须是字符串,否则不会发生筛选或多行聚合。
multiline
控制Filebeat如何处理跨越多行的日志消息的选项。
tail_files
如果此选项设置为true,Filebeat开始在每个文件的末尾读取新文件,而不是开始。将此选项与日志循环结合使用时,可能会跳过新文件中的第一个日志条目。默认设置是false
pipeline
摄取节点管道标识,用于为探测器生成的事件设置。
symlinks
该symlinks选项允许Filebeat除了常规文件之外还收集符号链接。收集符号链接时,Filebeat会打开并读取原始文件,即使它报告符号链接的路径。
backoff
退避选项指定Filebeat如何积极地搜索打开的文件以进行更新。在大多数情况下,您可以使用默认值。
harvester_limit
该harvester_limit选项限制了一个探矿者并行启动的收割机的数量。这直接关系到打开的文件处理程序的最大数量。默认为harvester_limit0,这意味着没有限制。如果要采集的文件数超过操作系统的打开文件处理程序限制,则此配置很有用。
enabled
该enabled选项可与每个探矿者一起使用,以定义探矿者是否启用。默认情况下,enabled被设置为true
msx_message_size
当使用type: udp,指定通过UDP接收的消息的最大大小。默认值是10240。

指定多个探矿器

当您需要从多个文件中收集行时,可以简单地配置一个探测器,并指定多个路径来为每个文件启动一个收集器。但是,如果你想申请额外的特定探矿(如fieldsinclude_linesexclude_linesmultiline,等),以从特定文件中获取的线,你需要在Filebeat配置文件中定义多个探矿。

1
2
3
4
5
6
7
8
9
10
11
filebeat.prospectors:
type: log
  paths:
    /var/log/system.log
    /var/log/wifi.log
type: log
  paths:
    "/var/log/apache2/*"
  fields:
    apache: true
  fields_under_root: true

 

config_dir
1
filebeat.config_dir: path/to/configs

包含其他探测器配置文件的目录的完整路径。每个配置文件必须以.yml。即使只处理文件的探测器部分,每个配置文件也必须指定完整的Filebeat配置层次结构。

shutdown_timeout

1
filebeat.shutdown_timeout:5s

您可以配置该shutdown_timeout选项以指定Filebeat在关闭之前等待发布者完成发送事件的最长时间。如果所有事件都被确认之前shutdown_timeout,Filebeat将关闭。

普通配置:

1
2
name: "my-shipper"
tags: ["service-X""web-tier"]name:Beat的名字。如果此选项为空,hostname则使用服务器。该名称被包括beat.name在每个已发布的交易中的字段中。您可以使用该名称对由单个节拍发送的所有交易进行分组。tags:Beat包含在tags每个已发布事务的字段中的标签列表。通过标签可以很容易地将服务器按不同的逻辑属性分组 例如,如果您有一组Web服务器,  则可以将“webservers”标记添加到每个服务器上的Beat,然后在Kibana Web界面中使用过滤器和查询来获取整个服务器组的可视化。  tags: ["my-service""hardware""test"]

fields

1
2
fields: {project: "myproject", instance-id"574734885120952459"}
您可以指定的可选字段将其他信息添加到输出。字段可以是标量值,数组,字典或这些的任何嵌套组合。默认情况下,您在此处指定的字段将被分组在fields输出文档的子字典下。要将自定义字段存储为顶级字段,请将该fields_under_root选项设置为true。fields_under_root如果此选项设置为true,则自定义字段将作为顶级字段存储在输出文档中,而不是在fields子字典下进行分组。如果自定义字段名称与其他字段名称冲突,则自定义字段将覆盖其他字段。
fields_under_root: true
fields:
  instance_id: i-10a64379
  region: us-east-1

探矿者配置

1
2
3
4
5
6
7
8
9
10
11
12
13
对于探矿者配置,您path可以在文件的filebeat.config.prospectors部分指定选项 filebeat.yml。
filebeat.config.prospectors:
  enabled: true
  path: configs/*.yml
type: log
  paths:
    /var/log/mysql.log
  scan_frequency: 10s
type: log
  paths:
    /var/log/apache.log
  scan_frequency: 5s两个正在运行的探矿者没有定义重叠的文件路径是至关重要的。如果多个探矿者同时收获同一个文件,可能会导致意想不到的行为。

 

模块配置

1
2
3
filebeat.config.modules:
  enabled: true
  path: ${path.config}/modules.d/*.yml
-  module:apache2 
  access:
    enabled:true 
    var.paths:[/var/log /apache2 / access.log*] 
  error:
    enabled:true 
    var.paths:[/var/log/apache2/error.log*]
1
对于模块配置,您path可以在文件filebeat.config.modules部分指定选项 filebeat.yml。默认情况下,Filebeat加载modules.d目录中启用的模块配置
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
ssh

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: