logstash,elasticsearch,kibana 怎麼進行nginx的日誌分析呢?首先,架構方面,nginx是有日誌文件的,它的每一個請求的狀態等都有日誌文件進行記錄。其次,須要有個隊列,redis的list結構正好能夠做爲隊列使用。而後分析使用elasticsearch就能夠進行分析和查詢了。nginx
咱們須要的是一個分佈式的,日誌收集和分析系統。logstash有agent和indexer兩個角色。對於agent角色,放在單獨的web機器上面,而後這個agent不斷地讀取nginx的日誌文件,每當它讀到新的日誌信息之後,就將日誌傳送到網絡上的一臺redis隊列上。對於隊列上的這些未處理的日誌,有不一樣的幾臺logstash indexer進行接收和分析。分析以後存儲到elasticsearch進行搜索分析。再由統一的kibana進行日誌web界面的展現。web
下面我計劃在一臺機器上實現這些角色。redis
在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,直接使用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 配置文件
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中。
對這個配置進行下說明:
好了,如今的結構就完成了,你能夠訪問一次test.dev以後就在kibana的控制檯看到這個訪問的日誌了。並且仍是結構化好的了,很是方便查找。
依次開啓es,logstash,kibana以後,可使用es的head插件確認下es中有access-xx.xx.xx索引的數據,而後打開kibana的頁面,第一次進入的時候會讓你選擇mapping,索引名字填寫access-*,則kibana自動會建立mapping