Beats:通过 Filebeat 把日志传入到 Elasticsearch

607 阅读8分钟

我们知道 Elastic Stack 被称之为 ELK (Elasticsearch,Logstash and Kibana)。由于beats的加入,现在很多人把 ELK 说成为ELKB。这里的 B 就是代表 Beats。Beats 在 Elasticsearch 中扮演很重要的角色。

从上面的图上,我们可以看出来,Beats 可以帮我们采集数据,并把它传入到 Elasticsearch 或 Logstash 之中。Beats 在发送数据之前也可以帮我们做一些简单的数据处理。在今天的文章中,我们来介绍一下如何通过 Filebeat 直接把数据传入到 Elasticsearch 之中。

Beats 是由 Go 语言来进行编程的。它是一种非常轻量级的应用,可以直接运行于客户端中。

 

什么是 Filebeat?

Filebeat 是一个属于 Beats 系列的日志托运者 - 一组安装在主机上的轻量级托运人,用于将不同类型的数据传送到 ELK 堆栈进行分析。每个 Beat 专门用于传送不同类型的信息 - 例如,Winlogbeat 发布 Windows 事件日志,Metricbeat 发布主机指标等等。顾名思义,Filebeat 提供日志文件。

在基于 ELK 的日志记录管道中,Filebeat 扮演日志代理的角色 - 安装在生成日志文件的计算机上,跟踪它们,并将数据转发到Logstash 以进行更高级的处理,或者直接转发到 Elasticsearch 进行索引。因此,Filebeat 不是 Logstash 的替代品,但在大多数情况下可以并且应该同时使用。您可以在 本文中阅读 有关 Beats 和 Filebeat 开发背后的故事的更多信息。

Logstash 需要运行 JVM,这种依赖性与 Ruby 中的实现相结合成为大量内存消耗的根本原因,尤其是涉及多个管道和高级过滤时。

Beats 是基于 Lumberjack 协议用 Go 语言编写的,旨在实现内存占用少,处理大量数据,支持加密以及有效处理背压。例如,Filebeat 记录在注册表中索引的最后一条成功行,因此,如果网络问题或传输中断,Filebeat将记住重新建立连接时中断的位置。如果输出,Logstash 或 Elasticsearch 存在摄取问题,Filebeat 将减慢文件读取速度。

 

在选用 Filebeat 或者是 Logstash 呢?

简单的答案是 - 至少在记录文件时,您几乎总是需要使用 Filebeat 和 Logstash 的组合。为什么?因为除非您只对时间戳和消息字段感兴趣,否则仍需要 Logstash 用于 ETL(转换)中的 “T”,并充当多个日志记录管道的聚合器。

Filebeat 是当今最好的日志文件发送器之一 - 它轻量级,支持 SSL 和 TLS 加密,支持背压,具有良好的内置恢复机制,并且非常可靠。但是,在大多数情况下,它不能使用用于日志增强的过滤器将日志转换为易于分析的结构化日志消息。这就是 Logstash 所扮演的角色。

Logstash 充当聚合器 - 在将数据推送到管道之前从各种源中提取数据,通常是 Elasticsearch,但也可以是大型生产环境中的缓冲组件。值得一提的是,最新版本的 Logstash 还包括在磁盘上存储消息队列时对持久队列的支持。如果你想了解更多,请参阅文章 “Logstash: Persistent Queue”。

Filebeat 和 Beats 系列的其他成员充当部署在边缘主机上的轻量级代理,将数据泵入 Logstash 以进行聚合,过滤和丰富。

 

安装 Filebeat

deb:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-amd64.deb
sudo dpkg -i filebeat-7.3.1-amd64.deb

rpm:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
sudo rpm -vi filebeat-7.3.1-x86_64.rpm

mac:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.3.1-darwin-x86_64.tar.gz

brew:

brew tap elastic/tap
brew install elastic/tap/filebeat-full

linux:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.3.1-linux-x86_64.tar.gz

这样我们的 Filebeat 就安装好了。请注意:由于 ELK 迭代比较快,我们可以把上面的版本 7.3.1 替换成我们需要的版本即可。我们先不要运行 Fliebeat。
我们通常可以使用如下的命令来导入我们需要的预知的 dashboard 已经 ingest pipeline:

./filebeat setup

关于上面的命令的解释,如果你有兴趣的话,可以参考文章 “Beats:解密 Filebeat 中的 setup 命令”。

在默认的情况下,我们直接运行 filebeat 的话,它选择的默认的配置文件是当前目录下的 filebeat.yml 文件。

filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - ./sample.log

output.logstash:
  hosts: ["localhost:5044"] 

我们可以打入一个测试命令来看一下执行的结果:

./filebeat test output

显示结果:

logstash: localhost:5044...
  connection...
    parse host... OK
    dns lookup... OK
    addresses: ::1, 127.0.0.1
    dial up... ERROR dial tcp 127.0.0.1:5044: connect: connection refused

返回信息显示,logstash 没有运行,端口 5044 没有被打开。在今天的练习中,我们将不使用 Logstash。我们直接将从 Filebeat 中收集到的数据发送到 Elasticsearch 中。

 

准备测试数据

 

我们在网址 logz.io/sample-data 下载一个叫做 apache-daily-access.log 的 log 文件。我们用 Atom 编辑器打开这个文件,显示有 17279 条数据:

每一条的数据是这样的格式:

20.168.183.41 - - [11/Sep/2019:00:00:05 +0000] "GET /category/health HTTP/1.1" 200 132 "/item/software/623" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7"

 

配置 Filebeat

为了能够 filebeat 把这个 log 数据传输到 Elasticsearch,我们可以使用如下的配置文件。我们创建一个叫做 filebeat_es.yml 文件:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /Users/liuxg/data/apache-daily-access.log

output:
  elasticsearch:
    hosts: ["localhost:9200"]

这里的配置非常简单。在上面的 paths 里,它指向我们的存放的 log 文件。当你们自己做这个练习的时候,请修改这个文件的路径。我们可以直接运行 filebeat:

$ ./filebeat -c filebeat_es.yml

我们也可以这样写:

filebeat.inputs:
- type: log
  enabled: true
  fields:
    apache: true
  paths:
    - /Users/liuxg/data/apache-daily-access.log

output.elasticsearch:
    hosts: ["localhost:9200"]

请注意这里的 output.elasticsearch。这样的写法和上面的稍微有些不同。看个人的爱好。更多的配置可以参阅 链接。在上面,我们在 source 里加入了一个 fields 叫做 “appach: true"。

      {
        "_index" : "filebeat-7.3.0-2019.09.11-000001",
        "_type" : "_doc",
        "_id" : "637VIG0BJD_DqHjgqvC5",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2019-09-11T14:58:55.902Z",
          "message" : """144.228.123.71 - - [11/Sep/2019:01:52:35 +0000] "GET /category/games HTTP/1.1" 200 117 "/search/?c=Books+Software" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
          "input" : {
            "type" : "log"
          },
          "fields" : {
            "apache" : true
          },
          "ecs" : {
            "version" : "1.0.1"
          },
          "host" : {
            "name" : "localhost"
          },
          "agent" : {
            "hostname" : "localhost",
            "id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
            "version" : "7.3.0",
            "type" : "filebeat",
            "ephemeral_id" : "ec3328d6-f7f0-4134-a2b6-8ff0c5141cc5"
          },
          "log" : {
            "offset" : 300352,
            "file" : {
              "path" : "/Users/liuxg/data/apache-daily-access.log"
            }
          }
        }
      }

你也可以加入一些 tags:

filebeat.inputs:
- type: log
  enabled: true
  fields:
    apache: true
  tags: ["my-service", "hardware", "test"]
  paths:
    - /Users/liuxg/data/apache-daily-access.log

output.elasticsearch:
  hosts: ["localhost:9200"]

这样在 _source 里就会出现一些 tag:

{
        "_index" : "filebeat-7.3.0-2019.09.11-000001",
        "_type" : "_doc",
        "_id" : "HIHyIG0BJD_DqHjgm0uL",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2019-09-11T15:30:33.163Z",
          "agent" : {
            "id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
            "version" : "7.3.0",
            "type" : "filebeat",
            "ephemeral_id" : "6fc482b2-fac8-4d79-8ca1-b27ef39cea3d",
            "hostname" : "localhost"
          },
          "log" : {
            "file" : {
              "path" : "/Users/liuxg/data/apache-daily-access.log"
            },
            "offset" : 11497
          },
          "message" : """164.51.31.185 - - [11/Sep/2019:00:04:15 +0000] "GET /item/giftcards/232 HTTP/1.1" 200 130 "/category/electronics" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
          "tags" : [
            "my-service",
            "hardware",
            "test"
          ],
          "input" : {
            "type" : "log"
          },
          "fields" : {
            "apache" : true
          },
          "ecs" : {
            "version" : "1.0.1"
          },
          "host" : {
            "name" : "localhost"
          }
        }
      }

那么在我们的 Kibana 中,我们可以看到一个叫做 filebeat-7.3.0-2019.09.11-000001 的 index 文件已经生产了:

 

Filebeat Processors

虽然不像 Logstash 那样强大和强大,但 Filebeat 可以在将数据转发到您选择的目标之前对日志数据应用基本处理和数据增强功能。 您可以解码 JSON 字符串,删除特定字段,添加各种元数据(例如 Docker,Kubernetes)等。

处理器在每个 prospector 的 Filebeat 配置文件中定义。 您可以使用条件语句定义规则以应用处理。 下面是一个使用 drop_fields 处理器从 Apache 访问日志中删除一些字段的示例:

filebeat.inputs:
- type: log
  enabled: true
  fields:
    apache: true
  tags: ["my-service", "hardware", "test"]
  paths:
    - /Users/liuxg/data/apache-daily-access.log

processors:
  - drop_fields:
      fields: ["ecs"]


output.elasticsearch:
  hosts: ["localhost:9200"]

在上面,我们把 ecs 字段删除,那么显示的结果为:

   {
        "_index" : "filebeat-7.3.0-2019.09.11-000001",
        "_type" : "_doc",
        "_id" : "m4H8IG0BJD_DqHjgZ47a",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2019-09-11T15:41:15.306Z",
          "host" : {
            "name" : "localhost"
          },
          "agent" : {
            "type" : "filebeat",
            "ephemeral_id" : "d32d0cea-966a-48d7-8728-dad5fc276b3a",
            "hostname" : "localhost",
            "id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
            "version" : "7.3.0"
          },
          "log" : {
            "offset" : 11497,
            "file" : {
              "path" : "/Users/liuxg/data/apache-daily-access.log"
            }
          },
          "message" : """164.51.31.185 - - [11/Sep/2019:00:04:15 +0000] "GET /item/giftcards/232 HTTP/1.1" 200 130 "/category/electronics" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
          "tags" : [
            "my-service",
            "hardware",
            "test"
          ],
          "input" : {
            "type" : "log"
          },
          "fields" : {
            "apache" : true
          }
        }
      }

显然相比较之前的 source,我们可以看出来 ecs 项已经不见了。

所有的 Processors 在一下列出:

 

Filebea 调试

默认情况下,Filebeat 将其所有输出发送到 syslog。 在前台运行 Filebeat 时,可以使用 -e 命令行标志将输出重定向到标准错误。 例如:

filebeat -e

默认配置文件是 filebeat.yml(文件的位置因平台而异)。 您可以通过指定 -c 标志来使用其他配置文件。 例如:

filebeat -e -c myfilebeatconfig.yml

您可以通过启用一个或多个调试选择器来增加调试消息的详细程度。 例如,要查看已发布的事务,可以使用发布选择器启动 Filebeat,如下所示:

filebeat -e -d "publish"

如果你想要所有的调试输出(公平警告,它是相当多的),你可以使用*,像这样:

filebeat -e -d "*"

参考:

【1】www.elastic.co/guide/en/be…