第二十三週微職位elk日誌系統

利用ELK+redis搭建一套nginx日誌分析平臺。

logstash,elasticsearch,kibana 怎麼進行nginx的日誌分析呢?首先,架構方面,nginx是有日誌文件的,它的每個請求的狀態等都有日誌文件進行記錄。其次,需要有個隊列,redis的list結構正好可以作爲隊列使用。然後分析使用elasticsearch就可以進行分析和查詢了。

我們需要的是一個分佈式的,日誌收集和分析系統。logstash有agent和indexer兩個角色。對於agent角色,放在單獨的web機器上面,然後這個agent不斷地讀取nginx的日誌文件,每當它讀到新的日誌信息以後,就將日誌傳送到網絡上的一臺redis隊列上。對於隊列上的這些未處理的日誌,有不同的幾臺logstash indexer進行接收和分析。分析之後存儲到elasticsearch進行搜索分析。再由統一的kibana進行日誌web界面的展示。

下面我計劃在一臺機器上實現這些角色。

準備工作

安裝了redis,開啓在6379端口
安裝了elasticsearch, 開啓在9200端口
安裝了kibana, 開啓了監控web
logstash安裝在/usr/local/logstash
nginx開啓了日誌,目錄爲:/usr/share/nginx/logs/test.access.log

設置nginx日誌格式

在nginx.conf 中設置日誌格式:logstash

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日誌:

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

開啓logstash agent

注:這裏也可以不用logstash,直接使用rsyslog

創建logstash agent 配置文件

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

代碼如下:

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

啓動logstash agent

/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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章