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