文章目录
- 概述
- 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下载页面
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
- 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.log
和wifi.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_lines
、include_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.name
和setup.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 输出的日志:
查看es,默认会按照filebeat-版本号-日期格式生成一个索引:
查看文档数据:
可以看到在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上数据
备注:在使用nginx module配置启动filebeat时,控制台报错,根据提示在es下安装以下两个插件,然后重启es、重新运行filebeat即可
sudo bin/elasticsearch-plugin install ingest-user-agent
sudo bin/elasticsearch-plugin install ingest-geoip
Filebeat工作原理
Filebeat由两个主要组件组成:prospector
和harvester
harvester:
- 负责读取单个文件的内容。
- 如果文件在读取时被删除或重命名,Filebeat将继续读取文件
prospector:
- prospector负责管理harvester并找到所有要读取的文件来源。
- 如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。
- Filebeat目前支持两种prospector类型:log和stdin。
Filebeat如何保持文件的状态?
- Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。
- 该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。
- 如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件
- 在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebeat时,将使用注册文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取
- 文件状态记录在data/registry文件中