Filebeat学习整理
filebeat概述
Filebeat是本地文件的日志数据发送者。作为服务器上的代理安装,Filebeat监视日志目录或特定的日志文件,tails文件,并转发到Elasticsearch或Logstash索引。Filebeat是一个Beat,它是基于libbeat框架。
工作原理:启动Filebeat时,它会启动一个或多个prospectors
(查找器),查看日志文件指定的本地路径。对于prospector所在的每个日志文件,Filebeat启动harvester
(采集器)。每个采集器都会为新内容读取一个日志文件,并将新的日志数据发送到libbeat,后者将聚合这些事件并将聚合的数据发送到为Filebeat配置的输出
filebeat功能:
- 读取日志文件,但不做数据的解析处理
- 保证数据”At Least Once”至少被读取一次,即数据不会丢
- 处理多行数据
- 解析JSON格式数据
- 简单的过滤功能
配置文件详解
#=========================== Filebeat prospectors =============================
filebeat.prospectors:
- type: log
enabled: true #更改为true以启用此prospectors配置。
paths: #应该被抓取和抓取的路径。 基于Glob的路径
- /home/test/logstash-tutorial.log
#tags: ["apache-access"] #标签可以很容易地在Kibana中选择特定的事件,或者在Logstash中应用条件过滤。 这些标签将被追加到一般配置中指定的标签列表中
#- c:\programdata\elasticsearch\logs\*
#exclude_lines: ['^DBG'] #排除行。 要匹配的正则表达式列表。 它删除与列表中任何正则表达式匹配的行。
#include_lines: ['^ERR', '^WARN'] #包括行。 要匹配的正则表达式列表。 它从列表中导出与任何正则表达式匹配的行。
#exclude_files: ['.gz$'] #排除文件。 要匹配的正则表达式列表。 Filebeat会从列表中删除与任何正则表达式匹配的文件。 默认情况下,没有文件被丢弃。
#fields: #可选的附加字段。 可以自由选择这些字段,以将其他信息添加到搜寻的日志文件中进行过滤
# level: debug
# review: 1
#fields_under_root: true
#json.keys_under_root: true
#json.add_error_key: true
### Multiline options
#multiline.pattern: ^\[ #比配的正则表达式
#multiline.negate: false #定义模式下的模式是否应该被否定。 默认是false。
#multiline.match: after #匹配可以设置为“after”或“before”。 它用于定义行是否应该附加到之前或之后(不匹配)的模式,或者只要模式不匹配,则基于否定。
#============================= Filebeat modules ===============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml #配置加载的全局模式
reload.enabled: true #设置为true以启用配置重新加载
reload.period: 10s #应检查路径下文件的更改时间间隔
#================================ General =====================================
name: "192.168.20.60" #发布网络数据的发送人的名称。 它可以用于将单个发货人在Web界面中发送的所有传输进行分组。
#tags: ["service-X", "web-tier"] #发送人的标签包含在他们自己的字段中,每次传输都会发布。
#fields: #可选字段,可以指定将其他信息添加到输出。
# env: staging
#============================== Dashboards =====================================
#setup.dashboards.enabled: false #这些设置控制将示例仪表板加载到Kibana索引。 加载仪表板默认是禁用的,可以通过在这里设置选项来启用,或者使用`-setup` CLI标记或`setup`命令启用。
#setup.dashboards.url: #从哪里下载仪表板归档的URL。 默认情况下,这个URL的值是根据节拍名称和版本计算的。 对于发布的版本,此URL指向artifacts.elastic.co网站上的仪表板存档。
#============================== Kibana =====================================
#从Beats版本6.0.0开始,仪表板通过Kibana API加载。这需要一个Kibana端点配置。
setup.kibana:
host: "192.168.20.60:5601"
#================================ Outputs =====================================
#配置发送beat收集的数据时使用的输出。
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
#hosts: ["192.168.20.60:9200"] #要连接的主机数组。
#protocol: "https" #可选协议和基本认证凭证。
#username: "elastic" #elasticsearch 的用户密码,需要安装x-pack才会有
#password: "changeme"
#----------------------------- Logstash output --------------------------------
output.logstash:
hosts: ["192.168.20.60:5044"] #Logstash主机
# loadbalance: true #如果设置为true,并且配置了多个Logstash主机,则输出插件将已发布的事件负载平衡到所有Logstash主机上。 如果设置为false,则输出插件会将所有事件发送到只有一个主机(随机确定),并且如果所选事件不响应,将切换到另一个主机。 默认值是false
#compression_level: 6 #gzip压缩级别。 将此值设置为0将禁用压缩。 压缩级别必须在1(最佳速度)到9(最佳压缩)的范围内。
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #可选的SSL。默认是关闭的。HTTPS服务器验证的根证书列表
#ssl.certificate: "/etc/pki/client/cert.pem" #SSL客户端认证证书
#ssl.key: "/etc/pki/client/cert.key" #客户证书密钥
#================================ Logging =====================================
#logging.level: debug ##设置日志级别。 默认的日志级别是info。可用的日志级别是:critical, error, warning, info, debug
#logging.selectors: ["*"] ##在调试级别,您可以选择性地启用仅针对某些组件的日志记录。 要启用所有选择器,请使用[“*”]。 其他选择器的例子是“beat”,“publish”,“service”。
使用模块
使用Filebeat模块是可选的,提供了一种快速处理常见日志格式的方法。它们包含默认配置、 Elasticsearch的节点管道定义,以及Kibana指示板。
Filebeat提供了几种不同的方式来启用模块:
- 在modules.d目录下启用模块配置
./filebeat modules enable apache2 #启用apache2模块
./filebeat modules list #查看启用和禁用模块的列表
# filebeat modules list
Enabled:
apache2 #解析由Apache HTTP服务器创建的访问和错误日志
Disabled:
auditd #收集并分析来自审计守护进程(auditd)的日志
icinga #解析Icinga的主要日志,调试日志和启动日志 (监控)
kafka #收集并分析由Kafka创建的日志
logstash #解析logstash常规日志和慢日志,支持纯文本格式和JSON格式
mysql #收集并分析由MySQL创建的慢日志和错误日志
nginx #分析由Nginx HTTP服务器创建的访问和错误日志
osquery #收集并解码由osqueryd 以JSON格式编写的结果日志 。要设置osqueryd,请遵循操作系统的osquery安装说明并配置filesystem日志记录驱动程序(默认设置)。确保UTC时间戳已启用
postgresql #收集并分析由PostgreSQL创建的日志
redis #分析由Redis创建的日志和缓慢日志
system #收集和分析由基于Unix / Linux的常见发行版的系统日志记录服务创建的日志
traefik #分析由Træfik创建的访问日志 (反向代理和负载均衡)
- 运行Filebeatedit时启用模块
./filebeat -e --modules nginx,apache2
在filebeat.yml文件中启用模块配置
推荐使用modules.d目录中的配置文件,在filebeat.yml文件中配置模块,将无法使用modules命令启用和禁用配置。要启用filebeat.yml配置文件中的特定模块,可以将条目添加到filebeat.modules列表中
filebeat.modules:
- module: apache2
- module: nginx
指定变量设置
通过在文件中指定变量设置
- module: apache2
# Access logs
access:
enabled: true
var.paths: ["/var/log/httpd/access_log*"]
# Error logs
error:
enabled: true
var.paths: ["/var/log/httpd/error_log*"]
在命令行中覆盖设置
filebeat --modules apache2 -M "apache.access.var.paths=["/var/log/httpd/access_log*"]" -M "apache.error.var.paths=["/var/log/httpd/error_log*"]"
实时重新加载
可以配置Filebeat以在发生更改时动态地重新加载配置文件。该功能仅适用于prospector和模块配置文件,要配置此功能,请指定一个路径(Glob)来监视配置更改。 当Glob找到的文件发生变化时,根据配置文件的变化启动和停止新的prospectors and/or模块。
此功能在容器环境中特别有用,其中一个容器用于在同一主机上的其他容器中运行服务的日志。要启用动态配置重新加载,请在filebeat.config.prospectors或filebeat.config.modules部分下指定路径和重新加载选项,如
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml #定义要检查更改的文件的Glob
reload.enabled: true #设置为true时,启用动态配置重新加载。
reload.period: 10s #指定文件检查更改的频率。 不要将周期设置为小于1秒,因为文件的修改时间通常以秒为单位存储。
配置日志输出
官方文档:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-logging.html
filebeat.yml配置文件的日志记录部分包含用于配置Beats日志记录输出的选项。 日志系统可以将日志写入系统日志或旋转日志文件。 如果未明确配置日志记录,则在Windows系统上使用文件输出,在Linux和OS X上使用syslog输出。
logging.level: info #输出的日志级别debug, info, warning, error, or critical
logging.to_files: true #如果为true,则将所有日志记录输出写入文件。 当达到日志文件大小限制时,日志文件会自动旋转
logging.to_syslog: false #如果为true,则将所有日志输出写入syslog
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0644
常见实践架构
(1)filebeat-->logstash-->elasticsearch-->kibana
(2)filebeat-->elasticsearch-->kibana
Ingest Node
:5.x新增的一个节点类型:
- 在数据写入es前(bulk/index操作)对数据进行处理
- 可设立独立的ingest node专门进行数据转换处理
node.ingest: true
- api endpoint为
pipeline
Ingest Node - Pipeline:
Pipeline由一系列processor
组成,类似logstash的filter plugin:
Processor对应logstash的filter Plugin,基本都涵盖了:Convert、Grok、Date、Gsub、Join、Json、Remove、Script
{
"description":"...",
"processors": [...]
}
Pipeline的API比较简单,主要有如下四个:
- 创建
PUT
- 获取
GET
- 删除
DELETE
- 模拟调试
SIMULATE
API示例:
PUT _ingest/pipeline/test
{
"description": "for test",
"processors": [
{
"set": {
"field": "name",
"value": "alfred"
}
}
]
}
GET _ingest/pipeline/test
DELETE _ingest/pipeline/test
GET _ingest/pipeline/test/_simulate
{
"docs": [
{
"_source":{
"message":"my message"
}
}
]
}
注意处理解析错误的情况:
Pipeline实践处理nginx日志:
日志处理中常用到两个es的插件:
./bin/elasticsearch-plugin install ingest-geoip
./bin/elasticsearch-plugin install ingest-user-agent
插件必须安装在群集中的每个节点上,并且每个节点必须在安装后重新启动(supervisor)。
PUT _ingest/pipeline/nginx_log
{
"description": "Pipeline for parsing Nginx access logs. Requires the geoip and user_agent plugins.",
"processors": [{
"grok": {
"field": "message",
"patterns":[
"\"?%{IP_LIST:nginx.access.remote_ip_list} - %{DATA:nginx.access.user_name} \\[%{HTTPDATE:nginx.access.time}\\] \"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\""
],
"pattern_definitions": {
"IP_LIST": "%{IP}(\"?,?\\s*%{IP})*"
},
"ignore_missing": true
}
}, {
"split": {
"field": "nginx.access.remote_ip_list",
"separator": "\"?,?\\s+"
}
}, {
"script": {
"lang": "painless",
"inline": "boolean isPrivate(def ip) { try { StringTokenizer tok = new StringTokenizer(ip, '.'); int firstByte = Integer.parseInt(tok.nextToken()); int secondByte = Integer.parseInt(tok.nextToken()); if (firstByte == 10) { return true; } if (firstByte == 192 && secondByte == 168) { return true; } if (firstByte == 172 && secondByte >= 16 && secondByte <= 31) { return true; } if (firstByte == 127) { return true; } return false; } catch (Exception e) { return false; } } def found = false; for (def item : ctx.nginx.access.remote_ip_list) { if (!isPrivate(item)) { ctx.nginx.access.remote_ip = item; found = true; break; } } if (!found) { ctx.nginx.access.remote_ip = ctx.nginx.access.remote_ip_list[0]; }"
}
}, {
"remove":{
"field": "message"
}
}, {
"rename": {
"field": "@timestamp",
"target_field": "read_timestamp"
}
}, {
"date": {
"field": "nginx.access.time",
"target_field": "@timestamp",
"formats": ["dd/MMM/YYYY:H:m:s Z"]
}
}, {
"remove": {
"field": "nginx.access.time"
}
}, {
"user_agent": {
"field": "nginx.access.agent",
"target_field": "nginx.access.user_agent"
}
}, {
"remove": {
"field": "nginx.access.agent"
}
}, {
"geoip": {
"field": "nginx.access.remote_ip",
"target_field": "nginx.access.geoip"
}
}],
"on_failure" : [{
"set" : {
"field" : "error.message",
"value" : "{{ _ingest.on_failure_message }}"
}
}]
}
nginx_log的写法其实就是filebeat中nginx模块ingest的配置:
nginx/access/ingest/default.json
测试:
GET _ingest/pipeline/nginx_log/_simulate
{
"docs": [
{
"_source":{
"message":"""93.180.71.3 - - [30/Jun/2018:15:52:27 +0800] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.20.102/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-""",
"@timestamp":""
}
}
]
}
案例:使用apache2模块
解析由Apache HTTP服务器创建的访问和错误日志
当你运行这个模块时,它会在下面执行一些任务:
- 设置日志文件的默认路径(可以覆盖默认值)
- 确保每个多行日志事件都作为单个事件发送
- 使用摄入节点来解析和处理日志行,将数据整形为适合在Kibana中可视化的结构
- 部署仪表板以可视化日志数据
兼容性:
该模块需要 ingest-user-agent和 ingest-geoip Elasticsearch插件。
/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin install ingest-geoip
/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin install ingest-user-agent
#查看安装的插件
/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin list
插件必须安装在群集中的每个节点上,并且每个节点必须在安装后重新启动(supervisor)。
设置并运行模块:
在执行这些步骤之前,确保Elasticsearch和Kibana安装完成并正在运行,并且Elasticsearch已准备好从Filebeat接收数据。
============= Kibana ================
setup.kibana:
host: "192.168.20.60:5601"
============= Outputs ===========
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.60:9200"]
1.启用模块:
./filebeat modules enable apache2
2.查看启用和禁用模块的列表:
./filebeat modules list
3.建立初始环境:
./filebeat setup -e
该setup命令加载用于写入Elasticsearch的推荐索引模板,并部署示例仪表板以在Kibana中可视化数据。这是一次性设置步骤。
-e标志是可选的,并将输出发送到标准错误而不是syslog
4.配置模块:
方法1:通过在文件中指定变量设置
- module: apache2
# Access logs
access:
enabled: true
var.paths: ["/var/log/httpd/access_log*"]
# Error logs
error:
enabled: true
var.paths: ["/var/log/httpd/error_log*"]
方法二:在命令行中覆盖设置
filebeat --modules apache2 -M "apache.access.var.paths=["/var/log/httpd/access_log*"]" -M "apache.error.var.paths=["/var/log/httpd/error_log*"]"
5.运行Filebeat:
/etc/init.d/filebeat start
6.探索kibana中的数据
打开浏览器并导航到Kibana中的仪表板概览:
http://192.168.20.60:5601/app/kibana#/dashboard/。在搜索框中 输入apache2,然后打开仪表板并浏览解析日志的可视化。
如果启用安全性,请使用设置安全性时使用的Kibana用户名和密码登录。
如果在Kibana中看不到数据,可以尝试将日期范围更改为更大的范围。默认情况下,Kibana显示最近15分钟