【发布时间】:2021-12-27 20:16:03
【问题描述】:
我正在设置 Logstash 以提取 Airflow 日志。以下配置为我提供了我需要的输出:
input {
file {
path => "/my_path/logs/**/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
if [path] =~ /\/my_path\/logs\/containers\/.*/ or [path] =~ /\/my_path\/logs\/scheduler\/.*/ {
drop{}
}
else {
grok {
"match" => [ "message", "\[%{TIMESTAMP_ISO8601:log_task_execution_datetime}\]%{SPACE}\{%{DATA:log_file_line}\}%{SPACE}%{WORD:log_level}%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}" ]
"remove_field" => [ "message" ]
}
date {
"match" => [ "log_task_execution_datetime", "ISO8601" ]
"target" => "log_task_execution_datetime"
"timezone" => "UTC"
}
dissect {
"mapping" => { "path" => "/my_path/logs/%{dag_id}/%{task_id}/%{dag_execution_datetime}/%{try_number}.%{}" }
"add_field" => { "log_id_template" => "{%{dag_id}}-{%{task_id}}-{%{dag_execution_datetime}}-{%{try_number}}" }
}
}
}
output {
stdout {codec => rubydebug{metadata => true}}
}
但我不喜欢多次指定路径“/my_path/logs/”。 在我的输入部分,我尝试使用:
add_field => { "[@metadata][base_path]" => "/my_path/logs/" }
然后,在过滤器部分:
if [path] =~ /[@metadata][base_path].*/ or [path] =~ /[@metadata][base_path].*/ {
drop{}
}
...
dissect {
"mapping" => { "path" => "[@metadata][base_path]%{dag_id}/%{task_id}/%{dag_execution_datetime}/%{try_number}.%{}" }
但它似乎不适用于过滤器或剖析映射中的正则表达式。尝试使用 here 所述的环境变量时,我遇到了类似的问题。
我有一个(也许是天真的)想法,我应该能够为所有对基本路径的引用使用一个变量。有什么办法吗?
【问题讨论】:
标签: logstash logstash-configuration logstash-file