【问题标题】:Logstash variable in pipeline config管道配置中的 Logstash 变量
【发布时间】: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


    【解决方案1】:

    不支持在条件中使用环境变量。自 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/ 那么它也会匹配。

    【讨论】:

    • 关于映射的好消息,谢谢,但我仍然有条件问题。如果我使用“[@metadata][base_path]”,我似乎无法使用正则表达式进行比较。我基本上是在尝试排除像“[@metadata][base_path]”/containers 这样的路径。我想我可以以某种方式将 [@metadata][base_path] 与“容器”连接起来,然后使用“if X in Z”语句。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多