如何通过Splunk SPL命令将JSON事件仅保留msg字段展示?
Splunk SPL实现仅保留JSON事件中msg字段的方法
问题场景
原始JSON事件:
{ "cf_app_id": "uuid", "cf_app_name": "app-name", "deployment": "cf", "event_type": "LogMessage", "info_splunk_index": "splunk-index", "ip": "ipaddr", "message_type": "OUT", "msg": "2022-12-22 19:11:30.242 DEBUG [app-name,02c11142eee3be456dc30ddb1b234d5f,f20222ba46461ea9] 28 --- [nio-8080-exec-1] classname : This is the log message", "origin": "rep", "source_instance": "0", "source_type": "APP/PROC/WEB", "timestamp": 1671732690242714069 }
期望输出格式:
{ "msg": "2022-12-22 19:11:30.242 DEBUG [app-name,02c11142eee3be456dc30ddb1b234d5f,f20222ba46461ea9] 28 --- [nio-8080-exec-1] classname : This is the log message" }
此前尝试命令 searchquery | eval _raw="{\"msg\":\""+_raw.msg+"\"}" 未生效。
解决方案
方法1:使用makejson(Splunk 8.1及以上版本推荐)
这是最简洁的方式,makejson会自动将指定字段转为标准JSON格式,处理转义问题:
your_base_search | fields msg # 仅保留msg字段 | makejson # 将保留的字段转换为JSON结构
方法2:手动重构_raw字段(兼容全版本)
如果你的Splunk版本较低,可通过提取字段后手动拼接JSON,注意转义msg中的双引号避免格式错误:
your_base_search | spath output=msg path=msg # 若Splunk已自动解析JSON,此步可省略 | eval _raw="{\"msg\":\"".replace(msg, "\"", "\\\"")."\"}" | fields _raw # 仅保留重构后的_raw字段
方法3:正则提取后重构(适用于未自动解析JSON的场景)
如果原始事件未被Splunk自动解析为JSON字段,可先用正则提取msg内容:
your_base_search | rex "\"msg\":\"(?<msg>[^\"]+)\"" # 提取msg字段的内容 | eval _raw="{\"msg\":\"".replace(msg, "\"", "\\\"")."\"}" | fields _raw
原命令失效原因
- 字段引用错误:Splunk中若JSON已被自动解析,直接使用字段名
msg即可,无需通过_raw.msg引用; - 未处理转义:若msg内容包含双引号,直接拼接会破坏JSON语法结构,必须用
replace转义双引号。
内容的提问来源于stack exchange,提问作者user2369634
相关产品推荐
相关产品推荐

