当JSON中的键值对丢失时,Logstash“ add_field”将“%{...}”保存为值

时间:2019-08-01 09:11:04

标签: elasticsearch logstash logstash-configuration filebeat logstash-file

add_field => {"ExampleFieldName" => "%{[example][jsonNested1][jsonNested2]}"}

我的Logstash从Filebeat接收一个JSON,其中包含对象example,该对象本身包含对象jsonNested1,该对象包含一个键值对(键为jsonNested2)。

如果jsonNested1存在并且jsonNested2存在并且包含一个值,那么该值将正确保存在Elasticsearch的{​​{1}}中。

ExampleFieldName

在这种情况下,{ "example": { "jsonNested1": { "jsonNested2": "exampleValue" } } } 将包含ExampleFieldName

exampleValue

在这种情况下,我希望{ "example": { "jsonNested1": { } } } 包含一个空字符串或根本不包含任何值(或者首先不要创建)。

但是碰巧ExampleFieldName包含字符串ExampleFiledName

我已经找到解决方案,方法是在执行%{[example][jsonNested1][jsonNested2]}之前先检查嵌套键值对是否存在。

add_field

此解决方案有效,但我无法相信这是实现此目的的最佳方法。我发现很奇怪,当键值对不存在时,Logstash甚至在这里将if [example][jsonNested1][jsonNested2] { mutate { add_field => {"ExampleFieldName" => "%{[example][jsonNested1][jsonNested2]}"} } } 另存为字符串。我希望它能够识别出这种情况,并且在这种情况下根本不保存任何值。

如果必须检查一个字段,则if语句是可以接受的解决方案。但是目前我正在使用大约50个字段进行Logstash配置。我应该在那里创建50个if语句吗?

1 个答案:

答案 0 :(得分:0)

您可以使用修剪过滤器解决此问题,其中blacklist_names的默认值是删除未解析的字段引用。