Logstash 从 logstash 过滤器中的 [@metadata] 获取值

Logstash Get the value from [@metadata] in logstash filter

我在 s3 中有这个文件结构:

mylogs/b222/foo/32/*.log
mylogs/b222/foo/33/*.log
mylogs/b233/foo11/33/*.log

我喜欢提取完整的文件路径,但无论如何我都无法使用@metadata 获取它 这是我的配置:

input {
      s3 {
        "access_key_id" => "xxxx"
        "secret_access_key" => "xxxx"
        "bucket" => "perso-logstash-logs"
        "additional_settings" => {
        "force_path_style" => true
        "follow_redirects" => false
        }
        
      }
    }
    filter {
    # parse pserver line
     
     
     mutate { add_field => { "file0" => "[@metadata]" } }
     mutate { add_field => { "file1" => "%{[@metadata]}" } }
     mutate { add_field => { "file2" => "%{[@metadata][key]}" } }
    

    
    }
    output {
      stdout { codec => rubydebug }
      elasticsearch {
        index => "%{version}-%{projname}-%{myId}-%{+YYYY.MM.dd}"
        hosts => [ "http://xxxx.svc:9200" ]
        user => "elastic"
        password => "xxxxxx"
        codec => "json"
      }
    }

这是我在日志中得到的输出: 只有 file1 给我日志文件的名称,但我想获取所有路径: 例如:

mylogs/b222/foo/32/foo.2021-01-07.0.log

{
    "@timestamp" => 2021-01-18T09:34:24.586Z,
     "@metadata" => {
        "s3" => {
            "key" => "foo.2021-01-07.0"
        }
    },
      "@version" => "1",
         "file2" => "%{[@metadata][key]}",
         "file0" => "[@metadata]",
         "file1" => "{\"s3\":{\"key\":\"foo.2021-01-07.0.log\"}}",
       "message" => "2021-01-07 08:58:55.519 [localhost-startStop-1] INFO  ......"
}

好吧,完整路径似乎不是事件的一部分,因此您无法从任何字段中提取它。导出哪些字段是输入过滤器实现的一部分。

请参阅以下 link 中的评论作为补充参考: Extracting fields from AWS S3 input paths in logstash

如果文件路径是静态的,您可以将其作为前缀添加到文件名中。

顺便说一句:

如你所见

"file1" => "{"s3":{"key":"foo.2021-01-07.0.log"}}",

字段“key”嵌套在另一个名为“s3”的字段中。

所以如果要提取文件名

mutate { add_field => { "file2" => "%{[@metadata][s3][key]}" } }

应该可以解决问题。

希望能帮到你