Splunk:从 JSON 结构中提取元素作为单独的字段

Splunk : Extracting the elements from JSON structure as separate fields

在 Splunk 中,我试图在 JSON 结构的“标签”元素中提取键值对,这样每个键值对都成为一个单独的列,以便我可以搜索它们。 例如:

| spath data | rename data.tags.EmailAddress AS Email

虽然这并没有帮助,但在 empty.I 尝试对所有标签执行此操作时出现电子邮件字段。任何 thoughts/pointers?

{
    "timestamp": "2021-10-26T18:23:05.180707Z",
    "data": {
        "tags": [
            {
                "key": "Email",
                "value": "john.doe@example.com"
            },
            {
                "key": "ProjectCode",
                "value": "ABCD"
            },
            {
                "key": "Owner",
                "value": "John Doe"
            }
        ]
    },
    "field1": "random1",
    "field2": "random2"
}

我认为可以如你所愿:

 | spath data.tags{}
 | mvexpand data.tags{}
 | spath input=data.tags{}
 | table key value
 | transpose header_field=key
 | fields - column

工作原理:

| spath data.tags{} 采用 json 并创建一个多值字段,其中包含标签数组中的每个项目

| mvexpand data.tags{} 将多值字段拆分为单独的事件 - 每个事件都包含标签数组中的一项

| spath input=data.tags{} 在每个事件中获取 json 并为该项目中的每个 KVP 创建一个字段(在本例中为 keyvalue

| table key value 限制对这两个字段的进一步命令

| transpose header_field=keykey 字段的每个值创建一个字段(包括名为 column 的字段)`

| fields - column 从输出中删除 column 字段

这是一个完全可运行的示例:

| makeresults
| eval _raw="
{
  \"timestamp\": \"2021-10-26T18:23:05.180707Z\",
  \"data\": {
    \"tags\": [
      {\"key\": \"Email\", \"value\": \"john.doe@example.com\"},
      {\"key\": \"ProjectCode\", \"value\": \"ABCD\"},
      {\"key\": \"Owner\", \"value\": \"John Doe\"}
    ]
  },
  \"field1\": \"random1\",
  \"field2\": \"random2\"
}
"
| spath data.tags{}
| mvexpand data.tags{}
| spath input=data.tags{}
| table key value
| transpose header_field=key

它创建了这个输出:

+----------------------+-------------+----------+
| Email                | ProjectCode | Owner    |
+----------------------+-------------+----------+
| john.doe@example.com | ABCD        | John Doe |
+----------------------+-------------+----------+