代码之家  ›  专栏  ›  技术社区  ›  TheSmartMonkey

无法使用grok match regex中的变量创建字段

  •  0
  • TheSmartMonkey  · 技术社区  · 6 年前

    我目前正在使用Logstash、ElasticSearch和Kibana 6.3.0

    我的日志是在一个唯一的ID路径上生成的:tmp/user_data/factorycontainer/images/(my unique id)/oar/oar_image_job(my unique 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"]
            }
        }
    }
    

    数据源字段是为了避免这个问题:当您将多个配置文件放在一个目录中供logstash使用时,它们都将被连接起来。

    在grok调试器中,%unixpath%编号:uid%unixpath my path返回良好值

    1 回复  |  直到 6 年前
        1
  •  0
  •   TheSmartMonkey    6 年前

    链接到解决方案: 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"]
        }
        }
    }