我正在使用一个摄取管道将一些日志注入elasticsearch,我已经使用grok解析了它。我已经设法提取了几乎所有我需要的数据,包括一个字符串( json_data
)我需要使用es的json处理器将其转换为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,我能做些什么来修复它?事先谢谢你的帮助。
2条答案
按热度按时间qoefvg9y1#
我设法找到了解决办法:
在本例中,使用给定的格式,我需要专门为json对象创建一个自定义模式。
我是用电脑做的
pattern_definitions
(doc)grok的属性,它允许我防止括号从字符串中排除。以下是
JSON
模式,基本上是GREEDYDATA
添加括号的图案:现在,我完整的grok模式看起来是这样的(由于@val,也简化了):
希望这能帮助其他人。
pdkcd3nj2#
好的开始!!我建议做两个改变以使它起作用
一是全部撤除
%{SPACE}
事件和简单地有正常的逐字空间另一种是两个去掉周围的花括号
%{GREEDYDATA:json_data}
它看起来是这样的:你会得到这样的结果: