logstash add_field和remove_field

时间:2016-02-16 16:42:39

标签: logstash logstash-grok logstash-configuration

我试图简化我的logstash配置。我想将程序字段拆分为单独的字段(如下所示)但是我更愿意只使用一个grok语句(如果可能的话!)

在下面的两个例子中,我在第二个例子中获得了_grokparsefailure,但不是第一个例子。由于grok有add_field和remove_field选项,我认为我可以将它全部合并到一个grok语句中。为什么不是这样?我在某个地方错过了某些排序/语法吗?

示例日志:

2016-02-16T16:42:06Z ubuntu docker/THISTESTNAME[892]: 172.16.229.1 - - [16/Feb/2016:16:42:06 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36" "-"

为什么这样做:

filter {

       # Extracts the docker name, ID, image etc elements
       mutate {
               add_field => { "[@metadata][program]" => "%{program}" }
               remove_field => "[program]"
       }

       grok {
                patterns_dir => "/logstash/patterns_dir/docker"
                match => { "[@metadata][program]" => "%{D_ID}" }
       }

}

但这不是:

filter {

        grok {
               add_field => { "[@metadata][program]" => "%{program}" }
               remove_field => "[program]"
               patterns_dir => "/logstash/patterns_dir/docker"
               match => { "[@metadata][program]" => "%{D_ID}" }
        }

}

2 个答案:

答案 0 :(得分:1)

add_field和remove_field仅在底层过滤器工作时运行。在您的第二个示例中,[@metadata] [program]尚不存在,您无法运行grok {}。

答案 1 :(得分:0)

@Alan直接回答了这个问题,但我发现这种方式更具可读性并且压缩了我的代码:

grok {
    patterns_dir => "/logstash/patterns_dir/docker-patterns"
    match => { "program" => "%{D_ID}" }
    overwrite => [ "program" ]
}