文章目录

  • 概述
  • Filebeat下载页面
  • Filebeat文件夹结构
  • Filebeat启动命令
  • Filebeat的处理流程
  • 常用配置解析
  • 输入类型配置解析
  • 输出类型配置解析
  • Console输出
  • ElasticSearch输出:
  • LogStash输出
  • 案例
  • 举例1:Filebeat收集日志并输出到控制台
  • 举例2:Filebeat收集日志输出到控制台 并展示自定义字段
  • 举例3:Filebeat收集Nginx运行日志并输出到es
  • 举例4:基于Nginx module使用Filebeat收集Nginx运行日志并输出到es
  • Filebeat工作原理


概述

Filebeat是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理安装,Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。

Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收割机都读取一个日志以获取新内容,并将新日志数据发送到libbeat,libbeat会汇总事件并将汇总的数据发送到您为Filebeat配置的输出。

filebeat DaemonSet部署添加 Kubernetes 元数据 filebeat_字段

Filebeat下载页面

https://www.elastic.co/cn/downloads/past-releases#filebeat

Filebeat文件夹结构

描述

filebeat

用于启动filebeat的二进制文件

data

持久化数据文件的位置

logs

Filebeat创建的日志的位置

modules.d

简化filebeat配置的模板文件夹,如nginx/kafka等日志收集模板

filebeat.yml

filebeat配置文件

Filebeat启动命令
./filebeat -e -c filebeat配置文件
Filebeat的处理流程
  • 输入Input
  • 处理Filter
  • 输出Output

Filebeat输入配置支持的输入类型有

  • Log
  • Stdin
  • Redis
  • UDP
  • Docker
  • TCP
  • Syslog

Filebeat支持的输出类型

  • ElasticSearch
  • LogStash
  • Kafka
  • Redis
  • File
  • Console
  • Cloud

常用配置解析

输入类型配置解析
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

①表示从system.logwifi.log收集日志

②表示收集apache2文件夹下的所有内容,并且使用fileds配置项将apache字段添加到输出中的根节点

paths:待收集日志的路径列表,可以为每行指定一个路径,每行以破折号(-)开头。Filebeat会为它在指定路径下找到的每个文件启动一个harvester(收集器)

encoding:读取数据时使用的编码

exclude_lines:filebeat会删除与列表中正则表达式匹配的任何行,默认情况下,不会删除任何行。忽略空行,如

filebeat.inputs:
- type: log
  ...
  exclude_lines: ['^DBG']

删除DBG开头的行。

include_lines:filebeat只会导出与列表中正则表达式匹配的任何行,默认情况下,将导出所有行。忽略空行,如

filebeat.inputs:
- type: log
  ...
  include_lines: ['^ERR', '^WARN']

只导出ERR/WARN开头的数据

enabled:使用enabled去启用或禁用inputs,默认设置为true

tags:Filebeat在每个已发布事件的标记字段中包含的标记列表。标记使得在Kibana中选择特定事件或在Logstash中应用条件过滤变得很容易。这些标记将被附加到常规配置中指定的标记列表中。

filebeat.inputs:
- type: log
  . . .
  tags: ["json"]

fields:可选字段,您可以指定将附加信息添加到输出中。例如,可以添加可用于筛选日志数据的字段。字段可以是标量值、数组、字典或它们的任何嵌套组合。默认情况下,此处指定的字段将分组到输出文档的字段子字典下。如

filebeat.inputs:
- type: log
  . . .
  fields:
    app_id: query_engine_12

fields_under_root: 将自定义字段显示为顶级字段

processors:可以过滤和增强导出的数据。使用exclude_linesinclude_lines可以达到过滤数据的作用,缺点是需要为每个配置文件配置所需的筛选条件。

每个处理器接收一个事件,对事件应用定义的操作,然后返回事件。如果定义处理器列表,则按照在Filebeat配置文件中定义的顺序执行这些处理器。

可以在配置中定义处理器,以便在事件被发送到配置的输出之前对其进行处理,libbeat类库提供的处理器可以处理以下内容:

  • 减少导出字段的数量
  • 使用其他元数据增强事件
  • 执行附加处理和解码

如 删除DBG开头的行

processors:
 - drop_event:
     when:
        regexp:
           message: "^DBG:"

如删除来自某个日志文件的所有日志消息

processors:
 - drop_event:
     when:
        contains:
           source: "test"
输出类型配置解析
Console输出
output.console:
  pretty: true

pretty: 如果pretty设置为true,则写入stdout的事件将被格式化。默认值为false

codec:输出编解码器配置。如果缺少编解码器部分,事件将使用“pretty”选项进行json编码。

enabled: enabled config是用于启用或禁用输出的布尔设置。如果设置为false,则禁用输出

ElasticSearch输出:
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"

hosts:要连接到的ElasticSearch节点的列表。事件按循环顺序分发到这些就饿点。如果一个节点无法访问,则事件将自动返送到另一个节点。每个Elas节点都可以定义为URL或IP:PORT。若没有指定port,则默认是9200

index:索引名称。默认的格式是filebeat-%{[beat.version]}-%{+yyyy.MM.dd}(如filebeat-6.5.4-2020-09-23)。如果修改了这个配置,则必须同时配置setup.template.namesetup.template.pattern

LogStash输出
output.logstash:
  hosts: ["127.0.0.1:5044"]

hosts:指定配置的LogStash服务器和监听的端口。

案例

举例1:Filebeat收集日志并输出到控制台

配置文件名称 filebeat_log.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /Users/wojiushiwo/Software/filebeat-6.5.4/log/*.log
output.console:
  pretty: true

读取/var/log下.log结尾的日志数据并输出到控制台

## -d 以debug方式启动
./filebeat -e -c filebeat_log.yml -d "publish"

在日志下输入hello

输出结果:

{
  "@timestamp": "2020-09-27T03:50:56.140Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "offset": 0,
  "message": "hello",
  "source": "/Users/wojiushiwo/Software/filebeat-6.5.4/log/a.log",
  "input": {
    "type": "log"
  },
  "prospector": {
    "type": "log"
  },
  "beat": {
    "name": "wojiushiwo-2.local",
    "hostname": "wojiushiwo-2.local",
    "version": "6.5.4"
  },
  "host": {
    "name": "wojiushiwo-2.local"
  }
}
举例2:Filebeat收集日志输出到控制台 并展示自定义字段
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /Users/wojiushiwo/Software/filebeat-6.5.4/log/*.log
  fields:
    name: wojiushiwo
output.console:
  pretty: true

在日志下输入hello world

输出结果:

{
  "@timestamp": "2020-09-27T03:54:32.012Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "offset": 6,
  "message": "hello world",
  "prospector": {
    "type": "log"
  },
  "input": {
    "type": "log"
  },
  "fields": {
    "name": "wojiushiwo"
  },
  "beat": {
    "version": "6.5.4",
    "name": "wojiushiwo-2.local",
    "hostname": "wojiushiwo-2.local"
  },
  "host": {
    "name": "wojiushiwo-2.local"
  },
  "source": "/Users/wojiushiwo/Software/filebeat-6.5.4/log/a.log"
}

请注意,自定义字段name,此时在fields内部

若须将name定义为顶级字段,则需要添加一个配置fields_under_root: true

完整的配置如下:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /Users/wojiushiwo/Software/filebeat-6.5.4/log/*.log
  fields:
    name: wojiushiwo
  fields_under_root: true
output.console:
  pretty: true

输出结果如下:

{
  "@timestamp": "2020-09-27T03:59:15.614Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "source": "/Users/wojiushiwo/Software/filebeat-6.5.4/log/a.log",
  "offset": 18,
  "message": "你好",
  "input": {
    "type": "log"
  },
  "prospector": {
    "type": "log"
  },
  "name": "wojiushiwo",
  "beat": {
    "name": "wojiushiwo-2.local",
    "hostname": "wojiushiwo-2.local",
    "version": "6.5.4"
  },
  "host": {
    "name": "wojiushiwo-2.local"
  }
}

请注意,自定义字段name

举例3:Filebeat收集Nginx运行日志并输出到es

Nginx 运行日志通常在/user/local/nginx/logs,有两个日志文件,分别是access.log和error.log

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log
  tags: ["nginx"]
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["http://localhost:9200"]

在浏览器上nginx欢迎页面 http://localhost:8000(我设置的nginx server端口是8000)

查看filebeat 输出的日志:

filebeat DaemonSet部署添加 Kubernetes 元数据 filebeat_filebeat_02

查看es,默认会按照filebeat-版本号-日期格式生成一个索引:

filebeat DaemonSet部署添加 Kubernetes 元数据 filebeat_filebeat_03

查看文档数据:

filebeat DaemonSet部署添加 Kubernetes 元数据 filebeat_elasticsearch_04

可以看到在message中已经获取到了Nginx的日志,但是内容还未经处理,只是读取到了原数据,对后期的操作不利,可以使用预设的module来处理nginx日志

举例4:基于Nginx module使用Filebeat收集Nginx运行日志并输出到es
## 查看module集合
./filebeat modules list
## 启用module
./filebeat modules enable module名称
## 禁用module
./filebeat modules disable module名称

启动nginx module

./filebeat modules enable nginx

查看module列表

➜  filebeat-6.5.4 ./filebeat modules list
Enabled:
nginx

Disabled:
apache2
auditd
elasticsearch
haproxy
icinga
iis
kafka
kibana
logstash
mongodb
mysql
osquery
postgresql
redis
suricata
system
traefik

配置Nginx Module

Nginx Module配置文件路径 ${FILEBEAT_HOME}/modules.d/nginx.yml

备注:未启用的module配置文件 后缀是.disabled

- module: nginx
  # Access logs
  access:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/access.log"]

  # Error logs
  error:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/error.log"]

配置filebeat

filebeat_nginx_module.yml

filebeat.inputs:
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["http://localhost:9200"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

启动filebeat

./filebeat -e -c filebeat_nginx_module.yml -d 'publish'

查看es上数据

filebeat DaemonSet部署添加 Kubernetes 元数据 filebeat_nginx_05

备注:在使用nginx module配置启动filebeat时,控制台报错,根据提示在es下安装以下两个插件,然后重启es、重新运行filebeat即可

sudo bin/elasticsearch-plugin install ingest-user-agent
sudo bin/elasticsearch-plugin install ingest-geoip

Filebeat工作原理

Filebeat由两个主要组件组成:prospectorharvester

harvester:

  • 负责读取单个文件的内容。
  • 如果文件在读取时被删除或重命名,Filebeat将继续读取文件

prospector:

  • prospector负责管理harvester并找到所有要读取的文件来源。
  • 如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。
  • Filebeat目前支持两种prospector类型:log和stdin。

Filebeat如何保持文件的状态?

  • Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。
  • 该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。
  • 如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件
  • 在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebeat时,将使用注册文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取
  • 文件状态记录在data/registry文件中