通过Filebeat把日志传入到Elasticsearch
学习的地方:配置文件中预先处理字段数据的用法
通过Filebeat把日志传入到Elasticsearch
Elastic Stack被称之为ELK (Elasticsearch,Logstash and Kibana)。由于beats的加入,现在很多人把ELK说成为ELKB。这里的B就是代表Beats。Beats在Elasticsearch中扮演很重要的角色。
Beats可以帮我们采集数据,并把它传入到Elasticsearch或Logstash之中。Beats在发送数据之前也可以帮我们做一些简单的数据处理。
Beats是由Go语言来进行编程的。它是一种非常轻量级的应用,可以直接运行于客户端中。
什么是Filebeat
Filebeat是一个属于Beats系列的日志托运者 - 一组安装在主机上的轻量级托运人,用于将不同类型的数据传送到ELK堆栈进行分析。每个Beat专门用于传送不同类型的信息 - 例如,Winlogbeat发布Windows事件日志,Metricbeat发布主机指标等等。顾名思义,Filebeat提供日志文件。
在基于ELK的日志记录管道中,Filebeat扮演日志代理的角色 - 安装在生成日志文件的计算机上,跟踪它们,并将数据转发到Logstash以进行更高级的处理,或者直接转发到Elasticsearch进行索引。因此,Filebeat不是Logstash的替代品,但在大多数情况下可以并且应该同时使用。
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还包括在磁盘上存储消息队列时对持久队列的支持。
Filebeat和Beats系列的其他成员充当部署在边缘主机上的轻量级代理,将数据泵入Logstash以进行聚合,过滤和丰富。
安装Filebeat
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。
在默认的情况下,我们直接运行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中。
准备测试数据
在网址https://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在一下列出:
add_cloud_metadata
add_locale
decode_json_fields
drop_event
drop_fields
include_fields
add_kubernetes_metadata
add_docker_metadata
Filebea 调试
默认情况下,Filebeat将其所有输出发送到syslog。 在前台运行Filebeat时,可以使用-e命令行标志将输出重定向到标准错误。 例如:
filebeat -e
默认配置文件是filebeat.yml(文件的位置因平台而异)。 您可以通过指定-c标志来使用其他配置文件。 例如:
filebeat -e -c myfilebeatconfig.yml
您可以通过启用一个或多个调试选择器来增加调试消息的详细程度。 例如,要查看已发布的事务,可以使用发布选择器启动Filebeat,如下所示:
filebeat -e -d "publish"
如果你想要所有的调试输出(公平警告,它是相当多的),你可以使用*
,像这样:
filebeat -e -d "*"
参考:https://www.elastic.co/guide/en/beats/filebeat/current/enable-filebeat-debugging.html