我们知道我们可以使用Filebeat很方便地把我们的log数据收集进来并直接写入到我们的Elasticsearch之中。
就像我们上面的这个图显示的一样。这样我们就不需要另外一个Logstash的部署了。Logstash可以很方便地帮我们对数据进行处理,比如对数据进行转换, 丰富数据等等。有一种情况,我们不想部署自己的Logstash,但是我们还是像对我们的数据进行一些处理,那么我们该怎么办?我们其实可以利用ingest node所提供的Pipeline帮我们对数据进行处理。
如果大家还不知道如何配置我们的node为一个ingest node的话,可以参阅我之前的文章“Elasticsarch中的一些重要概念:cluster, node, index, document, shards及replica”。我们需要在Elasticsearch中的配置文件elasticsearch.yml文件中配置:
node.ingest: true
ingest node提供了在对文档建立索引之前对其进行预处理的功能:
如果大家想对pipleline有更多的了解,请参阅我的文章“如何在Elasticsearch中使用pipeline API来对事件进行处理”。
一个pipleline就是一套处理器:
那么Elastic到底提供了哪些processor呢?我们可以参阅Elastic的官方文档,我们可以看到许多的pocessors可以被利用。
大家如果有兴趣的话,请查阅我们的官方文档做更一步的阅读。
定义一个Pipeline也是非常直接的,你可以使用PUT命令配合Ingest API来操作。它是存在于cluster state里的。
PUT _ingest/pipeline/my-pipeline-id
{
"description": "DESCRIPTION",
"processors": [
{
...
}
],
"on_failure": [
{
...
}
]
}
这里my-pipleline-id是我们自己命令的在该cluster唯一标识是的pipleline ID。在里面,我们可以定义我们喜欢的processors数组。在处理失败后,我们也可以定义相应的processors来完成。
在今天的这个例子里,我们来使用Filebeat来读取一个log文件,并使用processors对这个log的数据进行处理。
我们在网址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的话,请参阅我之前的文章“Beats:通过Filebeat把日志传入到Elasticsearch”。
为了能够filebeat把这个log数据传输到Elasticsearch,我们可以使用如下的配置文件。我们创建一个叫做filebeat_processor.yml文件:
filebeat.inputs:
- type: log
enabled: true
fields:
apache: true
paths:
- /Users/liuxg/data/apache-daily-access.log
output.elasticsearch:
hosts: ["localhost:9200"]
pipeline: "my_pipeline_id"
在这里请注意,我把上面下载的apache-daily-access.log文件置于我自己电脑的/User/liuxg/data目录下。在你自己做练习的时候,需要根据自己的文件路径进行调整。在这里,我们使用了一个叫做my_pipleline_id的pipeline。它的定义如下:
PUT _ingest/pipeline/my_pipeline_id
{
"description": "Drop ECS field and add one new field",
"processors": [
{
"remove": {
"field": "ecs"
},
"set": {
"field": "added_field",
"value": 0
}
}
]
}
在上面,我们定义了两个processor: remove及set。一个是删除一个叫做ecs的项,另外一个是添加一个叫做added_field的项,并把它的值设置为0。
在正常的情况下,如果在我们的配置文件中没有定义那个pipleline的情况下,那么他们的结果是:
{
"_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"
}
}
}
}
你可以参考我的文章“Beats:通过Filebeat把日志传入到Elasticsearch”来查看这个结果。显然这里是有ecs这个field的。
接下来,我们在Filebeat的安装目录,运行如下的命令:
./filebeat -c filebeat_processor.yml
我们在Kibana中可以通过如下的命令来查看:
GET _cat/indices?v
显然我们已经看到了一个已经生产的以filebeat为开头的文件名。我们可以通过如下的命令来查看它的数据:
GET filebeat-7.4.2/_search
那么其中的一个文档的soure是这样的:
"_source" : {
"agent" : {
"hostname" : "localhost",
"id" : "45832d40-b664-466b-a523-3bc58890ea50",
"type" : "filebeat",
"ephemeral_id" : "dbbba131-9c33-4e82-a00a-9e8e09d3e799",
"version" : "7.4.2"
},
"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"""",
"input" : {
"type" : "log"
},
"@timestamp" : "2019-11-23T13:11:57.478Z",
"host" : {
"name" : "localhost"
},
"fields" : {
"apache" : true
},
"added_field" : 0
}
显然ecs这个field已经不见了,而另外一个叫做added_field新的field被成功添加进来了。这个说明我们的pipleline是起作用的。