ElasticSearch - JSON 处理器输出单个字段名称,忽略其余部分

ElasticSearch - JSON processor outputs a single field name, leaving out the rest

我正在使用 摄取管道 将一些日志注入 ElasticSearch,我使用 Grok 对其进行了解析。 我设法提取了几乎所有我需要的数据,包括一个字符串 (json_data),我需要使用 ES 的 JSON processor.

将其转换为 JSON 对象

这是我正在处理的日志类型:

[2020-09-08T15:00:48.231213+02:00] security.INFO: Description {"ip_address":"123.45.0.1","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0","mobile":false,"base_reference":"demo_referentiel","base":"demo","user_id":"5","login":"admin_abc","type":"security"} []

下面是我的管道的处理器配置:

[
  {
    "grok": {
      "field": "message",
      "patterns": [
        "%{TIMESTAMP_ISO8601:timestamp}]%{SPACE}%{WORD:logger}.%{WORD:log_level}:%{SPACE}%{DATA:description}%{SPACE}{%{GREEDYDATA:json_data}}%{SPACE}%{GREEDYDATA:additional_data}"
      ]
    }
  },
  {
    "json": {
      "field": "json_data",
      "target_field": "json_data_parsed"
    }
  }
]

最后,"json_data" 字段如下所示:

"ip_adress":"123.45.0.1","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0","mobile":false,"base_reference":"demo_referentiel","base":"demo","user_id":"5","login":"admin_abc","type":"security"

而且,这就是问题所在; "json_data_parsed" 字段仅包含第一个字段名称。在此示例中,它只是 ip_address,没有其他任何内容。 编辑:Definition 是一个占位符,它通常包含几个单词,以空格分隔

为什么处理器似乎没有正确读取 JSON,我该如何解决? 在此先感谢您的帮助。

伟大的开始!!我建议进行两项更改以使其正常工作

  1. 一种是删除所有 %{SPACE} 处,只保留正常的逐字空格
  2. 另一种是两个去掉%{GREEDYDATA:json_data}
  3. 周围的花括号

看起来像这样:

"processors": [
  {
    "grok": {
      "field": "message",
      "patterns": [
        "%{TIMESTAMP_ISO8601:timestamp}]%{SPACE}%{WORD:logger}.%{WORD:log_level}: %{DATA:description} %{GREEDYDATA:json_data} %{GREEDYDATA:additional_data}"
      ]
    }
  },
  ...
]

你最终会得到这样的结果:

    "_source" : {
      "additional_data" : "[]",
      "logger" : "security",
      "log_level" : "INFO",
      "description" : "Description",
      "message" : """[2020-09-08T15:00:48.231213+02:00] security.INFO: Description {"ip_address":"123.45.0.1","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0","mobile":false,"base_reference":"demo_referentiel","base":"demo","user_id":"5","login":"admin_abc","type":"security"} []""",
      "json_data_parsed" : {
        "user_id" : "5",
        "mobile" : false,
        "ip_address" : "123.45.0.1",
        "login" : "admin_abc",
        "type" : "security",
        "base_reference" : "demo_referentiel",
        "http_user_agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0",
        "base" : "demo"
      },
      "json_data" : """{"ip_address":"123.45.0.1","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0","mobile":false,"base_reference":"demo_referentiel","base":"demo","user_id":"5","login":"admin_abc","type":"security"}""",
      "timestamp" : "2020-09-08T15:00:48.231213+02:00"
    },

我设法找到了解决方案:

在这种情况下,根据给定的格式,我需要专门为 JSON 对象创建一个自定义模式。

我使用 Grok 的 pattern_definitions (doc) 属性完成了它,这使我可以防止括号被排除在字符串之外。

这里是 JSON 模式的定义,它基本上是一个 GREEDYDATA 模式加上括号:

  "pattern_definitions": {
    "JSON": "{.*}"
   }

现在,我的完整 Grok 模式如下所示(由于 @Val 也得到了简化):

"%{TIMESTAMP_ISO8601:timestamp}] %{WORD:logger}.%{WORD:log_level}: %{GREEDYDATA:description} %{JSON:json_data} %{GREEDYDATA:additional_data}"

希望这会对其他人有所帮助。