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/

10-11 08:50