ElasticStack:如何在Kibana数据表中拆分字符串并聚合?
当然可以实现!我来给你拆解两种方案:一种是针对你现有数据的处理方法,另一种是更推荐的日志格式规范,让后续聚合分析更顺畅~
方案一:处理现有非结构化数据(Logstash阶段)
假设你的原始数据存在message字段中,内容是k1:v1 10 k1:v2 8 k2:v3 5 k2:v4 1,我们可以通过Logstash的Filter插件把它拆分成结构化字段,方便后续在Kibana中聚合:
- 第一步:拆分字符串为数组
先用mutate插件把整段文本按空格拆分成数组,方便后续分组处理:
filter { mutate { split => { "message" => " " } add_field => { "temp_array" => "%{message}" } } }
- 第二步:分组拆分并生成独立事件
用ruby插件遍历数组,每两个元素为一组(键值对+数值),拆分出分类(k1/k2)、项(v1/v2等)和计数,同时生成独立事件(这样每个条目单独一条数据,Kibana聚合更直观):
ruby { code => ' arr = event.get("temp_array") # 按每2个元素为一组遍历 arr.each_slice(2) do |kv_pair, count| # 拆分k:v为分类和项 k, v = kv_pair.split(":", 2) # 创建新事件 new_event = LogStash::Event.new( "category" => k, "item" => v, "count" => count.to_i ) # 输出新事件 event.spawn(new_event) end # 取消原事件,只保留拆分后的独立事件 event.cancel ' }
处理完成后,每个原事件会拆分成4条独立数据,每条数据包含category(k1/k2)、item(v1/v2等)、count(数值)字段。导入Kibana后,你就可以直接按category分组,对count做求和、平均值等聚合操作了。
方案二:推荐的结构化日志格式
如果可以修改原始日志的格式,强烈建议使用结构化JSON,这会让数据处理更高效、维护更简单,避免复杂的字符串拆分逻辑。
推荐格式示例
可以用数组包裹每个键值-计数条目:
{"myvals": [ {"category": "k1", "item": "v1", "count": 10}, {"category": "k1", "item": "v2", "count": 8}, {"category": "k2", "item": "v3", "count": 5}, {"category": "k2", "item": "v4", "count": 1} ]}
或者更简洁的单行结构化日志(每条数据单独一行):
{"category": "k1", "item": "v1", "count": 10} {"category": "k1", "item": "v2", "count": 8} {"category": "k2", "item": "v3", "count": 5} {"category": "k2", "item": "v4", "count": 1}
Logstash处理配置
对于这种结构化日志,只需要简单的json和split插件就能完成解析:
filter { # 解析JSON格式 json { source => "message" } # 如果是数组格式,拆分每个元素为独立事件 split { field => "myvals" } # 重命名字段并清理冗余 mutate { rename => { "[myvals][category]" => "category" } rename => { "[myvals][item]" => "item" } rename => { "[myvals][count]" => "count" } remove_field => ["myvals"] } }
处理后同样得到结构化的独立事件,在Kibana中做聚合分析会非常轻松——比如创建柱状图,用category作为X轴,count的总和作为Y轴,就能直观看到k1、k2的统计结果。
内容的提问来源于stack exchange,提问作者user3174311
相关产品推荐
相关产品推荐

