2016-09-28 299 views
3

我想用Kubernetes中的fluentd解析入口nginx日誌。在Logstash中這很容易,但我對於流利的語法感到困惑。解析nginx入口日誌fluentd

現在我有以下規則:

<source> 
    type tail 
    path /var/log/containers/*.log 
    pos_file /var/log/es-containers.log.pos 
    time_format %Y-%m-%dT%H:%M:%S.%NZ 
    tag kubernetes.* 
    format json 
    read_from_head true 
    keep_time_key true 
</source> 

<filter kubernetes.**> 
    type kubernetes_metadata 
</filter> 

而作爲一個結果我得到這個日誌,但它是不可析:

127.0.0.1 - [127.0.0.1] - user [27/Sep/2016:18:35:23 +0000] "POST /elasticsearch/_msearch?timeout=0&ignore_unavailable=true&preference=1475000747571 HTTP/2.0" 200 37593 "http://localhost/app/kibana" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Centos Chromium/52.0.2743.116 Chrome/52.0.2743.116 Safari/537.36" 951 0.408 10.64.92.20:5601 37377 0.407 200 

我想申請過濾規則可以在Kibana中通過IP地址,HTTP方法等搜索。我怎樣才能實現呢?

回答

4

流水線在logstash和fluentd上有很大不同。花費一些時間來構建Kubernetes - > Fluentd - > Elasticsearch - > Kibana解決方案。

簡短的回答我的問題是安裝流利,插件解析器插件(我不知道爲什麼它不標包內發貨),並把這個規則後kubernetes_metadata過濾器:

<filter kubernetes.var.log.containers.nginx-ingress-controller-**.log> 
    type parser 
    format /^(?<host>[^ ]*) (?<domain>[^ ]*) \[(?<x_forwarded_for>[^\]]*)\] (?<server_port>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+[^\"])(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")? (?<request_length>[^ ]*) (?<request_time>[^ ]*) (?:\[(?<proxy_upstream_name>[^\]]*)\])?(?<upstream_addr>[^ ]*) (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*)$/ 
    time_format %d/%b/%Y:%H:%M:%S %z 
    key_name log 
    types server_port:integer,code:integer,size:integer,request_length:integer,request_time:float,upstream_response_length:integer,upstream_response_time:float,upstream_status:integer 
    reserve_data yes 
</filter> 

長一點的回答有很多的例子是在這裏:https://github.com/kayrus/elk-kubernetes/

0

您可以使用多格式解析器插件,https://github.com/repeatedly/fluent-plugin-multi-format-parser

<match> 
    format multi_format 
    <pattern> 
    format json 
    </pattern> 
    <pattern> 
    format regexp... 
    time_key timestamp 
    </pattern> 
    <pattern> 
    format none 
    </pattern> 
</match> 

注意:我很好奇包括過濾器解析器在內的最終conf的樣子。