管道配置中的Logstash变量

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

我正在设置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}.%{}" }

但它似乎不适用于过滤器或解剖Map中的正则表达式。当我尝试使用here所描述的环境变量时,我遇到了类似的问题。
我有一个想法--也许是天真的想法--我应该能够使用一个变量来引用所有的基路径。

fnvucqvd

fnvucqvd1#

不支持在条件中使用环境变量。自2016年以来,有一个github issue请求将其作为一个增强开放。解决方法是使用mutate + add_field向[@metadata]添加一个字段,然后进行测试。

"mapping" => { "path" => "${[@metadata][base_path]}%{dag_id}/%{task_id} ...

条件中的项不是sprintf'd,因此不能使用%{},但可以进行子字符串匹配。如果FOO设置为/home/user/dir,则

mutate { add_field => { "[@metadata][base_path]" => "${FOO}" } }
    mutate { add_field => { "[path]" => "/home/user/dir/file" } }
    if [@metadata][base_path] in [path] {  mutate { add_field => { "matched" => true } } }

结果在[matched]字段得到添加。我不知道一种方法来锚定字符串匹配,所以如果FOO被设置为/dir/,那么它也会匹配。

相关问题