【问题标题】:Parse nginx ingress logs in fluentd在fluentd中解析nginx入口日志
【发布时间】:2017-02-06 03:04:10
【问题描述】:

我想在 Kubernetes 中使用 fluentd 解析入口 nginx 日志。这在 Logstash 中很容易,但我对流畅的语法感到困惑。

现在我有以下规则:

<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 方法等进行搜索。我该如何实现?

【问题讨论】:

    标签: nginx kubernetes fluentd


    【解决方案1】:

    logstash 和 fluentd 中的管道完全不同。并且花了一些时间来构建工作 Kubernetes -> Fluentd -> Elasticsearch -> Kibana 解决方案。

    对我的问题的简短回答是安装 fluent-plugin-parser 插件(我想知道为什么它不在标准包中提供)并将此规则放在 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/

    【讨论】:

    • 嘿。我收到如下错误:, key "code:integer" has no value (cannot end with ,)。似乎type @parser 根本没有types 这样的方法。至少我找不到。
    【解决方案2】:
    <match fluent.**>
      @type null
    </match>
    
    <source>
     @type tail
     path /var/log/containers/nginx*.log
     pos_file /data/fluentd/pos/fluentd-nginxlog1.log.pos
     tag nginxlogs
     format none
     read_from_head true
    </source>
    
    <filter nginxlogs>
      @type parser
      format json
      key_name message
    </filter>
    
    
    <filter nginxlogs>
      @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>[^ ]*) \w*$/
      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
    </filter>
    
    <match nginxlogs>
      @type stdout
    </match>
    

    【讨论】:

      【解决方案3】:

      您可以使用多格式解析器插件,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 是什么样的,包括过滤器解析器。

      【讨论】:

        【解决方案4】:

        因为,你使用 json 格式进行解析。 尝试这个。 http://docs.fluentd.org/articles/recipe-nginx-to-elasticsearch

        如果您使用自定义格式,您可能需要编写自己的正则表达式。 http://docs.fluentd.org/articles/in_tail

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-19
          • 2017-05-18
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          相关资源
          最近更新 更多