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]}" } }
应该可以解决问题。
希望能帮到你
我在 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]}" } }
应该可以解决问题。
希望能帮到你