ElasticSearch JSON处理器仅输出首个字段的问题排查与解决
嘿,我来帮你搞定这个问题!你遇到的JSON处理器只解析出第一个字段的情况,核心原因很明确——你通过Grok提取到的json_data字段里,引号是HTML实体转义后的",而非标准JSON要求的双引号",导致Elasticsearch的JSON处理器无法识别完整的JSON结构。
具体原因分析
看你提供的日志示例,里面的JSON部分是用"代替了普通双引号:
[2020-09-08T15:00:48.231213+02:00] security.INFO: Description {"ip_address":"123.45.0.1",...} []
Grok提取后,json_data字段里保留的就是这些"字符。而ES的JSON处理器只能解析格式严格符合规范的JSON,它会把"当成普通字符串内容,而非JSON的键值对分隔符。这种情况下,处理器只能错误识别出第一个“看起来像键值对”的片段,也就是ip_address字段,后续内容都无法被正确解析。
解决办法
最直接的方案是在JSON处理器之前,添加一个gsub处理器,把"替换成标准双引号"。修改后的Ingest Pipeline配置如下:
[ { "grok": { "field": "message", "patterns": [ "%{TIMESTAMP_ISO8601:timestamp}]%{SPACE}%{WORD:logger}.%{WORD:log_level}:%{SPACE}%{DATA:description}%{SPACE}{%{GREEDYDATA:json_data}}%{SPACE}%{GREEDYDATA:additional_data}" ] } }, { "gsub": { "field": "json_data", "pattern": """, "replacement": "\"" } }, { "json": { "field": "json_data", "target_field": "json_data_parsed" } } ]
验证效果
添加gsub处理器后,json_data会被转换为标准JSON格式:{"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",...}
此时ES的JSON处理器就能正确解析整个JSON结构,生成完整的json_data_parsed对象,包含所有字段。
内容的提问来源于stack exchange,提问作者ilomax

