第二十三周微职位elk日志系统

利用ELK+redis搭建一套nginx日志分析平台。python

logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每一个请求的状态等都有日志文件进行记录。其次,须要有个队列,redis的list结构正好能够做为队列使用。而后分析使用elasticsearch就能够进行分析和查询了。nginx

咱们须要的是一个分布式的,日志收集和分析系统。logstash有agent和indexer两个角色。对于agent角色,放在单独的web机器上面,而后这个agent不断地读取nginx的日志文件,每当它读到新的日志信息之后,就将日志传送到网络上的一台redis队列上。对于队列上的这些未处理的日志,有不一样的几台logstash indexer进行接收和分析。分析以后存储到elasticsearch进行搜索分析。再由统一的kibana进行日志web界面的展现。web

下面我计划在一台机器上实现这些角色。redis

准备工做

安装了redis,开启在6379端口
安装了elasticsearch, 开启在9200端口
安装了kibana, 开启了监控web
logstash安装在/usr/local/logstash
nginx开启了日志,目录为:/usr/share/nginx/logs/test.access.log

设置nginx日志格式

在nginx.conf 中设置日志格式:logstashvim

log_format logstash '$http_host $server_addr $remote_addr [$time_local] "$request" '
                    '$request_body $status $body_bytes_sent "$http_referer" "$http_user_agent" '
                    '$request_time $upstream_response_time';

在vhost/test.conf中设置access日志:api

access_log  /usr/share/nginx/logs/test.access.log  logstash;

开启logstash agent

注:这里也能够不用logstash,直接使用rsyslog网络

建立logstash agent 配置文件架构

vim /usr/local/logstash/etc/logstash_agent.conf

代码以下:app

input {
        file {
                type => "nginx_access"
                path => ["/usr/share/nginx/logs/test.access.log"]
        } 
}
output {
        redis {
                host => "localhost"
                data_type => "list"
                key => "logstash:redis"               
        } 
}

启动logstash agentdom

/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash_agent.conf
这个时候,它就会把test.access.log中的数据传送到redis中,至关于tail -f。

开启logstash indexer

建立 logstash indexer 配置文件

vim /usr/local/logstash/etc/logstash_indexer.conf

代码以下:

input {

        redis {

                host => "localhost"

                data_type => "list"

                key => "logstash:redis"

                type => "redis-input"

        }

 }

 filter {

        grok {

            match => [

                 "message", "%{WORD:http_host} %{URIHOST:api_domain} %{IP:inner_ip} %{IP:lvs_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} %{URIPATH:baseurl}(?:\?%{NOTSPACE:request}|) HTTP/%{NUMBER:http_version}\" (?:-|%{NOTSPACE:request}) %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} (?:%{NUMBER:time_backend_response:float}|-)"

             ]

       }

          kv {

            prefix => "request."

           field_split => "&"

           source => "request"

          }

       urldecode {

            all_fields => true

        }

        date {

            type => "log-date"

            match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]

        }

  } output {

            elasticsearch {

                    embedded => false

                    protocol => "http"

                    host => "localhost"

                    port => "9200"

                    index => "access-%{+YYYY.MM.dd}" 

            } 

  }

这份配置是将nginx_access结构化之后塞入elasticsearch中。

对这个配置进行下说明:

grok中的match正好匹配和不管是GET,仍是POST的请求。
kv是将request中的A=B&C=D的key,value扩展开来,而且利用es的无schema的特性,保证了若是你增长了一个参数,能够当即生效
urldecode是为了保证参数中有中文的话进行urldecode
date是为了让es中保存的文档的时间为日志的时间,不然是插入es的时间
好了,如今的结构就完成了,你能够访问一次test.dev以后就在kibana的控制台看到这个访问的日志了。并且仍是结构化好的了,很是方便查找

使用kibana进行查看

依次开启es,logstash,kibana以后,可使用es的head插件确认下es中有access-xx.xx.xx索引的数据,而后打开kibana的页面,第一次进入的时候会让你选择mapping,索引名字填写access-*,则kibana自动会建立mapping

相关文章
相关标签/搜索