Logstash Filter -如何使用一个字段的值作为一个带有解析json的新字段的名称?

guykilcj  于 2022-12-09  发布在  Logstash
关注(0)|答案(1)|浏览(178)

我有一个json事件进入logstash,如下所示(每个事件中的值不同):

{ 
  "metadata":{
     "app_type":"Foo",
     "app_namespace":"System.Bar"
     "json_string":"{\"test\":true}"
  }
}

我希望我的logstash过滤器输出以下内容到elasticsearch(我不担心修剪现有字段):

{
  "app_event":{
    "foo":{
      "system_bar":{
        "test":true
      }
    }
  }
}

我不知道如何使用字段值作为新字段名称的语法。
我尝试了几种不同的方法,在启动我的logstash示例时都导致了一个配置错误。我在我的示例中只包括了logstash.conf的过滤器块,其余的配置都按预期工作。
1.

# note this one does not have replacement and lowercase values I want
filter {
   json {
      source => "[metadata][json_string]"
      target => "[app_event][%{[metadata][app_type]}][%{[metadata][app_namespace]}]"
   }
}

1.我试着用我需要的值创建变量,然后在目标中使用这些值

filter {
      appType = "%{[metadata][instrument_type]}".downcase
      appNamespace = "%{[metadata][app_namespace]}".downcase
      appNamespace.gsub(".", "_")

      json {
        source => "[metadata][json_string]"
        target => "[app_event][#{appType}][#{appNamespace}]"
      }      
}

1.只是为了确认其他一切都设置正确,这确实工作,但不包括动态生成的字段结构,我正在寻找。

filter {
      json {
        source => "[metadata][json_string]"
        target => "[app_event]"
      }      
}
nwwlzxa7

nwwlzxa71#

json过滤器不会打印target的值,因此您不能以这些方式使用json过滤器。要使字段名称可变,您必须使用Ruby过滤器。请尝试

json { source => "message" target => "[@metadata][json1]" remove_field => [ "message" ] }
    json { source => "[@metadata][json1][metadata][json_string]" target => "[@metadata][json2]" }
    ruby {
        code => '
            namespace = event.get("[@metadata][json1][metadata][app_namespace]")
            if namespace
                namespace = namespace.downcase.sub("\.", "_")
            end
            type = event.get("[@metadata][json1][metadata][app_type]")
            if type
                type = type.downcase
            end
            value = event.get("[@metadata][json2]")
            if type and namespace and value
                event.set("app_event", { "#{type}" => { "#{namespace}" => value } } )
            end
        '
    }

相关问题