在logstash

时间:2015-08-06 18:42:53

标签: logstash logstash-configuration

我正在尝试使用logstash来解析来自ELB日志文件的HTTP get请求中的键值对。

请求字段看起来像 http://aaa.bbb/get?a=1&b=2

我希望上面的日志行中有ab的字段,我无法搞清楚。

我的logstash conf(为清晰起见而格式化)低于该值不会加载任何其他关键字段。我假设我需要拆分URI的地址部分,但还没想出来。

input {
    file {
        path => "/home/ubuntu/logs/**/*.log"
        type => "elb"
        start_position => "beginning"
        sincedb_path => "log_sincedb"
    }
}
filter {
    if [type] == "elb" {
        grok {
            match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} 
%{NOTSPACE:loadbalancer} %{IP:client_ip}:%{NUMBER:client_port:int}
%{IP:backend_ip}:%{NUMBER:backend_port:int} 
%{NUMBER:request_processing_time:float}
%{NUMBER:backend_processing_time:float} 
%{NUMBER:response_processing_time:float} 
%{NUMBER:elb_status_code:int}
%{NUMBER:backend_status_code:int} 
%{NUMBER:received_bytes:int} %{NUMBER:sent_bytes:int} 
%{QS:request}" ]
        }
        date {
            match => [ "timestamp", "ISO8601" ]
        }
        kv {
            field_split => "&?"
            source => "request"
            exclude_keys => ["callback"]
        }
    }
}


output {
    elasticsearch { host => localhost }
}

1 个答案:

答案 0 :(得分:8)

kv将获取一个网址并拆分参数。此配置有效:

input {
    stdin { }
}

filter {
    mutate {
            add_field => { "request" => "http://aaa.bbb/get?a=1&b=2" }
    }

    kv {
            field_split => "&?"
            source => "request"
    }
}

output {
    stdout {
            codec => rubydebug
    }
}

stdout显示:

{
   "request" => "http://aaa.bbb/get?a=1&b=2",
         "a" => "1",
         "b" => "2"
}

尽管如此,我建议您创建自己的默认URI模式版本,以便设置字段。然后,您可以将查询字符串字段传递给kv。它那样清洁。

更新:

对于"制作自己的模式",我打算采用现有模式并根据需要进行修改。在logstash 1.4中,安装它们就像将它们放入新文件中一样简单'模式'目录;我还不知道> 1.4的模式。

MY_URIPATHPARAM %{URIPATH}(?:%{URIPARAM:myuriparams})?
MY_URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{MY_URIPATHPARAM})?

然后你可以在你的grok {}模式中使用MY_URI,它会创建一个名为myuriparams的字段,你可以将其输入到kv {}。