无法通过grok匹配正则表达式创建变量的字段

时间:2018-08-01 15:34:54

标签: logstash logstash-grok

我目前正在使用logstash,elasticsearch和kibana 6.3.0

我的日志在唯一的ID路径下生成:/ tmp / USER_DATA / FactoryContainer / images /(我的唯一ID)/ oar / oar_image_job(我的唯一ID).stdout

我想做的就是匹配这个唯一的ID,并用这个ID创建一个字段。

我对Logstash过滤器有点新手,但是我不知道为什么它不想使用我的uid并总是在我的字段中返回%{uid}或此操作无法执行错误。

我的过滤器:

input {
  file {
    path => "/tmp/USER_DATA/FactoryContainer/images/*/oar/oar_image_job*.stdout"
    start_position => "beginning"
    add_field => { "data_source" => "oar-image-job" }
   }
}

filter {
    grok {
        match => ["path","%{UNIXPATH}%{NUMBER:uid}%{UNIXPATH}"]
    }
    mutate {
        add_field => [ "unique_id" => "%{uid}" ]
    }
}

output {
  if [data_source] == "oar-image-job" {
    elasticsearch {
        index => "oar-image-job-%{+YYYY.MM.dd}"
        hosts => ["localhost:9200"]
        }
    }
}

data_source字段是为了避免此问题:将多个配置文件放在Logstash使用的目录中时,它们将全部串联在一起

在grok调试器%{UNIXPATH}%{NUMBER:uid}%{UNIXPATH}中,我的路径返回了很好的价值

1 个答案:

答案 0 :(得分:0)

链接到解决方案:https://discuss.elastic.co/t/cant-create-a-field-with-a-variable-from-a-grok-match-regex/142613/7?u=thesmartmonkey

正确的过滤器:

input {
  file {
    path => "/tmp/USER_DATA/FactoryContainer/images/*/oar/oar_image_job*.stdout"
    start_position => "beginning"
    add_field => { "data_source" => "oar-image-job" }
   }
}

filter {
    grok {
        match => { "path" => [ "/tmp/USER_DATA/FactoryContainer/images/%{DATA:unique_id}/oar/oar_image_job%{DATA}.stdout" ] }
    }

}

output {
  if [data_source] == "oar-image-job" {
    elasticsearch {
        index => "oar-image-job-%{+YYYY.MM.dd}"
    hosts => ["localhost:9200"]
    }
    }
}