使用elk+redis搭建nginx日誌分析平臺

elk+redis 搭建nginx日誌分析平臺

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。elasticsearch

開啓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

祝:玩的愉快

相關文章
相關標籤/搜索