最近遇到一个困惑,在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开始。
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容器的运行需要指定elasticsearch的url,通过环境变量传递进去即可,并暴露默认端口5601供浏览器访问
docker run --name mykibana -e ELASTICSEARCH_URL=http://172.17.0.2:9200 -p 5601:5601 -d kibana
到目前为止,还没有日志输入到es中,kibana自然也没有什么内容可以查询了。
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并不能解析出来,这个原因没找到。。。。。同一种方式解析,理论上应该不存在一部分解析的出来一部分解析不出来,除非使用的配置是不一样的。