定义
Filebeat modules 简化了公共日志格式的收集、解析和可视化。一个典型的模块(例如,对于Nginx日志)是由一个或多个fileset组成的(以Nginx为例,access 和 error)。
一个fileset包含以下内容:
- Filebeat 输入配置,其中包含要默认的查找或者日志文件路径。这些默认路径取决于操作系统。Filebeat配置还负责在需要的时候拼接多行事件。
- Elasticsearch Ingest Node 管道定义,用于解析日志行。
- 字段定义,用于为每个字段在Elasticsearch中配置正确类型。它们还包含每个字段的简短描述。
- 简单的Kibana dashboards,用于可视化日志文件。
Filebeat会根据你的环境自动调整这些配置,并将它们加载到相应的 Elastic stack 组件中。Filebeat提供了一组预先构建的模块,你可以使用这些模块快速实现并部署一个日志监控解决方案,包括样例指示板和数据可视化,节省了你配置的时间。这些模块支持常见的日志格式,如Nginx、Apache2和MySQL等。
官方文档:
需求
比如我们有这样一个需求,我们需要把 Nginx的 access 日志采集到ElasticSearch,并且能细粒度化的控制。换句话说 我们需要切分Nginx的日志,比如 remote_addr,upstream_response_time 等需要切成JSON格式。
分析
对于这个需求,我们自然想到如下几个方案:
(1) 把 Access日志 定义成 logstash_json,那样数据流到es的时候自然是json格式。形如:
log_format logstash_json '{ "timestamp": "$time_local", '
'"remote_addr": "$remote_addr", '
'"status": "$status", '
'"request_time": "$request_time", '
'"upstream_response_time": "$upstream_response_time", '
'"body_bytes_sent":"$body_bytes_sent", '
'"request": "$request", '
'"http_referrer": "$http_referer", '
'"upstream_addr": "$upstream_addr", '
'"http_x_real_ip": "$http_x_real_ip", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent",'
'"request_filename": "$request_filename" }';
(2) 我们可以通过Logstash 的Grok模块去实现。
以上两种方法也是我们常用的,但是今天我们直接使用内置 Filebeat modules 的Nginx模块来实现
解决
Filebeat modules 常用命令:
./filebeat modules list # 显示所有模块
./filebeat modules -h # 显示modules帮助命令
./filebeat -h # 显示帮助命令
./filebeat modules enable nginx # 启用指定模块
./filebeat -e # 前台执行
当我们启用Nginx的模块的时候,modules下的后缀自动去掉了。
[www@me03 modules.d]$ pwd
/opt/application/elk/test-filebeat/modules.d
[www@me03 modules.d]$ ls
apache.yml.disabled googlecloud.yml.disabled kibana.yml.disabled netflow.yml.disabled redis.yml.disabled
auditd.yml.disabled haproxy.yml.disabled logstash.yml.disabled nginx.yml santa.yml.disabled
cisco.yml.disabled icinga.yml.disabled mongodb.yml.disabled osquery.yml.disabled suricata.yml.disabled
coredns.yml.disabled iis.yml.disabled mssql.yml.disabled panw.yml.disabled system.yml.disabled
elasticsearch.yml.disabled iptables.yml.disabled mysql.yml.disabled postgresql.yml.disabled traefik.yml.disabled
envoyproxy.yml.disabled kafka.yml.disabled nats.yml.disabled rabbitmq.yml.disabled zeek.yml.disabled
[www@me03 modules.d]$
我们编辑 nginx.yml ,指定采集的nginx的日志路径:
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.3/filebeat-module-nginx.html
- module: nginx
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/home/data/logs/www.qq.cn/*.access.log"]
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths
尝试方案一:
我们把Filelebeat 采集的数据往Logstash去,再看看是否正常解析,标准输出是否正常。Logstash的配置如下:
input {
beats {
port => "5044"
}
}
filter {
}
output {
stdout { codec => rubydebug }
}
结果输出如下:
{
"message" => "[02/Jan/2020:20:32:24 +0800] 192.168.106.162 200 0.000 - 10 \"GET / HTTP/1.1\" \"-\" - - \"-\" curl/7.29.0\" /home/data/webroot/www.qq.cn/xxooo.html ",
"event" => {
"module" => "nginx",
"dataset" => "nginx.access",
"timezone" => "+08:00"
},
"@timestamp" => 2020-04-09T08:13:09.487Z,
"input" => {
"type" => "log"
},
"host" => {
"name" => "me03"
},
"fileset" => {
"name" => "access"
},
"agent" => {
"hostname" => "me03",
"id" => "2046309e-6157-4114-890a-65dc8142264b",
"ephemeral_id" => "b6e4a023-cc9a-4257-9d45-7f710d2d3425",
"version" => "7.3.0",
"type" => "filebeat"
},
"log" => {
"file" => {
"path" => "/home/data/logs/www.qq.cn/www.qq.cn.access.log"
},
"offset" => 4702
},
"ecs" => {
"version" => "1.0.1"
},
"@version" => "1",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"service" => {
"type" => "nginx"
}
}
结果并没有正常切成json。
尝试方案二:
Filebeat 直接输出ElasticSearch,配置如下:
## 输出到es
output:
elasticsearch:
hosts: ["localhost:9200"]
然后执行 ./filebeat setup 生效:
[www@me03 test-filebeat]$ ./filebeat setup
Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Loaded machine learning job configurations
Loaded Ingest pipelines
我们再看看ELasticSeach的索引:
Dev Tools 查询ElasticSearch的数据:
创建index pattern,使用filebeat-*,然后在Kibana进行查询该索引结果:
发现并没有把Nginx的日志进行json切割了。
我们再来看看Kibana的Dashboard:
大盘图如下:
这个大盘,我们猜想是在使用 ./filebeat setup 创建的。
结论
从上面的尝试我们得出了结论: Filebeat提供了一组预先构建的模块,但并不是万能的解析你的日志格式,并切成你想要的json格式.