You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

原命令失效原因

  1. 字段引用错误:Splunk中若JSON已被自动解析,直接使用字段名msg即可,无需通过_raw.msg引用;
  2. 未处理转义:若msg内容包含双引号,直接拼接会破坏JSON语法结构,必须用replace转义双引号。

内容的提问来源于stack exchange,提问作者user2369634

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:20:39