add_field => {"ExampleFieldName" => "%{[example][jsonNested1][jsonNested2]}"}
我的Logstash从Filebeat接收一个JSON,其中包含对象
example
,该对象本身包含对象jsonNested1
,该对象包含一个键值对(键为jsonNested2
)。如果存在
jsonNested1
并且jsonNested2
存在并且包含一个值,那么此值将正确保存在Elasticsearch的ExampleFieldName
中。{
"example": {
"jsonNested1": {
"jsonNested2": "exampleValue"
}
}
}
在这种情况下,
ExampleFieldName
将包含exampleValue
。{
"example": {
"jsonNested1": {
}
}
}
在这种情况下,我希望
ExampleFieldName
包含一个空字符串或根本不包含任何值(或者不首先创建)。但是碰巧
ExampleFiledName
包含字符串%{[example][jsonNested1][jsonNested2]}
。我已经通过执行
add_field
之前先检查嵌套键值对是否存在找到了解决方案。if [example][jsonNested1][jsonNested2] {
mutate {
add_field => {"ExampleFieldName" => "%{[example][jsonNested1][jsonNested2]}"}
}
}
该解决方案有效,但是我不敢相信这是最好的方法。我发现很奇怪,当键值对不存在时,Logstash甚至将
%{[example][jsonNested1][jsonNested2]}
保存为字符串。我希望它能够认识到这一点,并且在这种情况下根本不保存任何值(value)。如果必须检查一个字段,则if语句是可以接受的解决方案。但是目前我正在使用大约50个字段进行Logstash配置。我应该在那里创建50个if语句吗?
最佳答案
您可以使用修剪过滤器解决此问题,其中blacklist_names的默认值是删除未解析的字段引用。
关于elasticsearch - 当JSON中的键值对丢失时,Logstash “add_field”将 “%{…}”保存为值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57305540/