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,我该如何解决?
在此先感谢您的帮助。
伟大的开始!!我建议进行两项更改以使其正常工作
- 一种是删除所有
%{SPACE}
处,只保留正常的逐字空格
- 另一种是两个去掉
%{GREEDYDATA:json_data}
周围的花括号
看起来像这样:
"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}"
希望这会对其他人有所帮助。
我正在使用 摄取管道 将一些日志注入 ElasticSearch,我使用 Grok 对其进行了解析。
我设法提取了几乎所有我需要的数据,包括一个字符串 (json_data
),我需要使用 ES 的 JSON processor.
这是我正在处理的日志类型:
[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,我该如何解决? 在此先感谢您的帮助。
伟大的开始!!我建议进行两项更改以使其正常工作
- 一种是删除所有
%{SPACE}
处,只保留正常的逐字空格 - 另一种是两个去掉
%{GREEDYDATA:json_data}
周围的花括号
看起来像这样:
"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}"
希望这会对其他人有所帮助。