记一次Docker下安装Logstash+Elasticsearch+Kibana经历
阅读原文时间:2021年04月20日阅读:1

前言

最近遇到一个困惑,在kibana上捞客户端用户行为相关的数据,无奈无法提取一个字段中的kv值。作为一个移动开发人员,对这种东西简直就是日了狗了,请教了下公司推荐组的人,也没有得到结果,靠人不如靠自己去。

这个数据在kibana上显示的是一个用英文逗号分隔,用等号连接的键值对,假设这个字段显示的是args,其值为:

args:key1=value1,key2=value2,key3=value3

而我想要的结果就是提取args中的键值对到外层,便于进行一些图表方面的统计,比如某个字段的成功率等,提取后的内容如下:

args:key1=value1,key2=value2,key3=value3
key1:value1
key2:value2
key3:value3

在这之前,需要把对应的环境先搭建起来,这里使用Docker进行搭建,对Logstash+Elasticsearch+Kibana不了解的可以简单了解下这篇文章,ELKstack 中文指南。而Logstash,个人找到一篇相对比较详细入门的介绍,也可以看下logstash快速入门,在写这篇文章之前,我个人也是对这三个东西一无所知,完全从0开始。

Elasticsearch的安装

Mac下Docker的安装见Mac OSX Docker下搭建Android+Jenkins+Gitlab,elasticsearch需要暴露两个端口,9200和9300,我们直接使用docker run命令运行一个elasticsearch容器。

docker run --name myes -d -p 9200:9200 -p 9300:9300 elasticsearch

容器运行起来后可以在日志中找到对应的ip:port,注意这里不能使用localhost,具体原因可能localhost指的是该容器本身,而我们需要在另一个容器中访问该容器,因此需要。。。。(计算机网络的内容忘得差不多了,专业术语无视就好)

从图中看到,ip加端口的值为172.17.0.2:9200

kibana的安装

kibana容器的运行需要指定elasticsearch的url,通过环境变量传递进去即可,并暴露默认端口5601供浏览器访问

docker run --name mykibana -e ELASTICSEARCH_URL=http://172.17.0.2:9200 -p 5601:5601 -d kibana

到目前为止,还没有日志输入到es中,kibana自然也没有什么内容可以查询了。

Logstash的安装

docker运行logstash的容器的时候,需要指定输入输出及过滤器,我们先使用控制台输入,然后输出到控制台。

docker run -it --rm logstash -e 'input { stdin { } } output { stdout { } }'

然后在控制台输入helloworld,你就能立即看到输出了

文章开头说到了日志内容不能被解析的问题,简单尝试了下,可以进行解析,不过需要对logstash的配置进行修改

input { 
//控制台输入
    stdin { } 
} 

filter { 
//kv插件,每一对使用|分割,kv使用=分割
    kv { 
        source => "message" 
        field_split => "|" 
        value_split => "=" 
    } 
//将args作为输入再次分割
    kv {
        source => "args" 
        field_split => "&"
        value_split => "=" 
    }
} 
output { 
//输出到es
    elasticsearch {  
        hosts => ["172.17.0.2:9200"] 
    } 
//同时输出到控制台
    stdout { 
        codec => rubydebug 
    } 
}

这里使用了kv插件进行解析,举一个例子,我的日志输入内容为:

arg1=a1|arg2=b2|arg3=c3|args=a=b&b=c&c=d&d=e

最终上面的内容会被解析成

arg1=a1
arg2=b2
arg3=c3
a=b
b=c
c=d
d=e

运行docker命令,传入刚刚的logstash的配置

docker run -it --rm logstash -e 'input { stdin { } } filter { kv { source => "message" field_split => "|" value_split => "=" } kv { source => "args" field_split => "&" value_split => "=" } } output { elasticsearch {  hosts => ["172.17.0.2:9200"] } stdout { codec => rubydebug } }'

在控制台中输入

arg1=a1|arg2=b2|arg3=c3|args=a=b&b=c&c=d&d=e

然后控制台就会输出解析后的内容

打开kibana验证一下,浏览器输入http://localhost:5601/,先建立索引,直接点击create即可

然后就能看的解析后的内容了

如果字段上出现黄色的警告,必要时到Setting Tab刷新一下filed list即可。

总结

经过自己的一番实验,对于args中的内容,解析出来是完全没有什么问题的,关键在于logstash的配置问题,然后问题并没有这么简单,对于同一个配置,发现一部分日志中的args能被解析出来,还有大部分的日志的args并不能解析出来,这个原因没找到。。。。。同一种方式解析,理论上应该不存在一部分解析的出来一部分解析不出来,除非使用的配置是不一样的。