如何在Splunk中正确统计数组字段restaurants的元素数量?
Splunk计算JSON数组字段元素数量的问题
问题描述
已将本地$SPLUNK_DATA目录下的JSON数据导入Splunk,数据内容如下:
{"level":"info","msg":"","restaurants":[{"name":"El Farolito","cuisine":"Mexican"}],"time":"2024-09-29T12:32:37-07:00"} {"level":"info","msg":"","restaurants":[{"name":"Flour + Water","cuisine":"Italian"},{"name":"San Ho Won","cuisine":"Korean"}],"time":"2024-09-29T12:32:37-07:00"}
启动Splunk使用的Docker命令:
docker run -it -e SPLUNK_START_ARGS=--accept-license -e SPLUNK_PASSWORD=helloworld -p 8000:8000 -p 8089:8089 --volume $SPLUNK_DATA:/home/splunk splunk/splunk start
登录后通过Settings -> Data input -> File从/home/splunk目录导入文件,现在需要添加新字段n表示每条日志中restaurants数组的元素数量(第一条日志n=1,第二条n=2),尝试过以下查询但无效,字段n为空:
index=main | eval n=mvcount('restaurants{}')
解决方案
方法1:用spath解析数组后统计
Splunk默认不会自动将嵌套JSON数组转为多值字段,需要先通过spath提取数组元素,再用mvcount计算数量:
index=main | spath path=restaurants{} output=restaurants_list | eval n=mvcount(restaurants_list) | sort n
方法2:直接用spath获取数组长度
更简洁的方式是利用spath的count参数直接返回数组长度:
index=main | spath path=restaurants count=true output=n | sort n
方法3:使用json命令(Splunk 8.1+适用)
如果是Splunk 8.1及以上版本,可直接用json命令提取数组后统计:
index=main | json restaurants as restaurants_array | eval n=mvcount(restaurants_array) | sort n
说明
最初的查询无效,是因为restaurants{}的写法需要Splunk已将数组解析为多值字段,但默认情况下嵌套JSON数组不会自动拆分,必须通过spath或json命令显式处理。执行上述任一查询后,字段n会正确显示每条日志的餐馆数量,再通过sort n即可按数量排序。
内容的提问来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

