Filebeat modules 你真正理解了吗?

本文探讨了Filebeatmodules在日志收集、解析及可视化的应用,通过实例演示如何配置Nginx模块以采集特定日志,并对比了不同输出方式对日志格式的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

Filebeat modules 简化了公共日志格式的收集、解析和可视化。一个典型的模块(例如,对于Nginx日志)是由一个或多个fileset组成的(以Nginx为例,access 和 error)。

一个fileset包含以下内容:

  • Filebeat 输入配置,其中包含要默认的查找或者日志文件路径。这些默认路径取决于操作系统。Filebeat配置还负责在需要的时候拼接多行事件。
  • Elasticsearch Ingest Node 管道定义,用于解析日志行。
  • 字段定义,用于为每个字段在Elasticsearch中配置正确类型。它们还包含每个字段的简短描述。
  • 简单的Kibana dashboards,用于可视化日志文件。

Filebeat会根据你的环境自动调整这些配置,并将它们加载到相应的 Elastic stack 组件中。Filebeat提供了一组预先构建的模块,你可以使用这些模块快速实现并部署一个日志监控解决方案,包括样例指示板和数据可视化,节省了你配置的时间。这些模块支持常见的日志格式,如Nginx、Apache2和MySQL等。

官方文档:

        https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-module-nginx.html

需求

比如我们有这样一个需求,我们需要把 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

本文博客地址: https://blog.csdn.net/knight_zhou/article/details/105412501

尝试方案一: 

我们把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格式.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叱咤少帅(少帅)

如果文章对你有帮助就打赏下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值