zoukankan      html  css  js  c++  java
  • elk系列7之通过grok分析apache日志

    preface

    说道分析日志,我们知道的采集方式有2种:

    1. 通过grok在logstash的filter里面过滤匹配。
    2. logstash --> redis --> python(py脚本过滤匹配) --> ES

    第一种方式是不怎么推荐使用的,除非是在日志量比较小的场景才推荐使用。因为grok非常影响性能的,且不够灵活,除非你很懂ruby。
    第二种方式是 我们一直推荐使用的架构,讲究松耦合关系。

    下面我们还是说说第一种方式,然后再说第二种方式。

    grok模块是作用在filter里面的,它是个可以分析任意文本内容和重构内容的模块。它是当前最好的模块在logstash上处理糟糕,乱序的日志数据,可以把这些数据分析成有序,可查询的。并且,它可以很好的处理syslog,apache 和其他的webserver,mysql logs等日志。通常来说,对于我们使用者(不是计算机,是人类)来说,任何日志格式都可以被写入的。
    所以这里我们让grok结合apache的日志做分析。

    apache默认日志格式:

    我们打开apache的日志配置选项,可以看到

    LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
    

    参数解释:

    • %h: 这是发送请求到服务器的客户的IP地址
    • %l: 这是由客户端identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效
    • %u: 这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。
    • %t:这是服务器完成请求处理时的时间,其格式是:
      [日/月/年:时:分:秒 时区]
      日 = 2数字
      月 = 3字母
      年 = 4数字
      时 = 2数字
      分 = 2数字
      秒 = 2数字
      时区 = (+|-)4数字
    • "%r": 引号中是客户端发出的包含许多有用信息的请求行
    • %>s: 这是服务器返回给客户端的状态码。
    • %b: 最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"-",如果希望记录为"0"的形式,就应该用%B 。

    更多资料,可以参考:http://www.jinbuguo.com/apache/menu22/logs.html

    grok模块使用--拿个例子热热身

    下面看看grok的使用,可以参考官网地址:https://www.elastic.co/guide/en/logstash/2.3/plugins-filters-grok.html#plugins-filters-grok
    logstash的一些核心模块在这里面:/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns
    我们参考官网的例子来做下:
    首先配置logstash。

    [root@linux-node1 conf.d]# cat apache.conf
    input {
      stdin {
      }
    }
    filter {
      grok {
        match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }   # 这些IP,WORD等等都是logstash内部设定好的匹配。
      }
    }
    
    output{
        stdout {
            codec => rubydebug
        }
    }
    
    

    确认无误后启动,输入一列信息:

    [root@linux-node1 conf.d]# /opt/logstash/bin/logstash -f apache.conf
    Settings: Default pipeline workers: 2
    Pipeline main started
    55.3.244.1 GET /index.html 15824 0.043
    {
           "message" => "55.3.244.1 GET /index.html 15824 0.043",
          "@version" => "1",
        "@timestamp" => "2016-12-11T04:36:26.387Z",
              "host" => "linux-node1",
            "client" => "55.3.244.1",
            "method" => "GET",
           "request" => "/index.html",
             "bytes" => "15824",
          "duration" => "0.043"
    }
    
    

    上面可得,logstash是正常工作的,filter里面能够识别对应的信息。下面就开始真正分析apache的日志。

    分析apapche的日志

    我们使用logstash自带的apache日志分析模块来使用,模块位于这下面:

    [root@linux-node1 conf.d]# vim /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
    ''''''
     93 COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth}   [%{HTTPDATE:timestamp}] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpvers    ion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)     # 第93行
     94 COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}   # 第94行
    ''''''
    

    这个文件里有很多模块可以使用,可以根据自己的需求来调用。
    根据上面提供的模块,我们可以直接配置在logstash里面,如下所示:

    [root@linux-node1 conf.d]# cat /etc/logstash/conf.d/apache.conf
    input {
      file {
        path => "/var/log/httpd/access_log"
        start_position => "beginning"
      }
    }
    filter {
      grok {
          match => { "message" => "%{COMBINEDAPACHELOG}"}   # 调用刚才找到的模块
      }
    }
    
    output{
        stdout {
            codec => rubydebug
        }
    }
    
    

    确认配置没有问题,那么就启动logstash

    [root@linux-node1 conf.d]# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf
    

    此时我们可以在head上看到apache的日志索引了。。。然后老套路,在kibana里面创建索引就可了。

  • 相关阅读:
    个人编写的一个简单的DB类
    Access绝对地址
    sentry cli 上传source map
    自动旋转的饼图(echarts)
    点会转的折线图还带着柱子
    node 自动化工程部署
    SQL 模糊查询
    编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
    configure、make、make install 解释
    Linux学习笔记(实时更新)
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6159591.html
Copyright © 2011-2022 走看看