日誌監控和分析在保障業務穩定運行時,起到了很重要的作用,不過一般情況下日誌都分散在各個生產服務器,且開發人員無法登陸生產服務器,這時候就需要一個集中式的日誌收集裝置,對日誌中的關鍵字進行監控,觸發異常時進行報警,並且開發人員能夠查看相關日誌。logstash+elasticsearch+kibana3就是實現這樣功能的一套系統,並且功能更強大。
logstash:是一個管理日誌和事件的工具,你可以收集它們,解析它們,並存儲它們以供以後使用(例如日誌搜索),logstash有一個內置的web界面,用來搜索你的所有日誌。logstash在部署時有兩種運行模式:standalone和centralized:
* standalone:standalone的意思是所有的事情都在一臺服務器上運行,包括日誌收集、日誌索引、前端WEB界面都部署在一臺機器上。
* centralized:就是多服務器模式,從很多服務器運輸(ship)日誌到一臺總的日誌(collector)服務器上用來索引和查找。
需要注意的是logstash本身並沒有什麼shipper和indexer這種說法,因爲不論是運輸日誌的進程還是彙集總的日誌的進程運行的都是同一個程序,只是使用的配置文件不同而已。
elasticsearch:
基於lucene的開源搜索引擎,是一個分佈式的搜索分析系統,主要特點有:real time data、real time analytics、distributed、high availability、multi-tenancy、full text search、document oriented、conflict management、schema free、restful api等等。
kibana3:
可視化日誌和數據系統,作爲WEB前端可以很容易的和elasticsearch系統結合。kibana有版本2和版本3的區分,版本2採用ruby編寫,部署起來很麻煩,需要安裝很多ruby依賴包(目前網上多是這個版本的部署),版本3採用純html+css編寫,因此部署起來很方便,解壓即用,目前已經是kibana4了,建議大家使用最新版。
出於性能及擴展性考慮,實際應用中logstash我們必然採用centralized模式,最基本的結構圖如下:
1、安裝redis,安裝過程簡單,這裏不做詳細說明。
2、安裝ElasticSearch(目前版本1.4)
wget 'https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.7.tar.gz'
tar zxvf elasticsearch-0.90.7.tar.gz
cd elasticsearch-0.90.7/bin
#可以在logstash agent啓動後再啓動
./elasticsearch -f
3、啓動logstash shipper,定義配置文件logstash.conf,根據實際情況定義,以下主要定義了input源爲文件,output到redis,啓動logstash shipper,例如:
input {
file {
type => "api_log"
path => "/home/jws/app/nginxserver/logs/apiaccess.log"
debug => true
}
file {
type => "cas_log"
path => "/home/jws/app/nginxserver/logs/casaccess.log"
debug => true
}
file {
type => "id_log"
path => "/home/jws/app/nginxserver/logs/idaccess.log"
debug => true
}
file {
type => "login_log"
path => "/home/jws/app/nginxserver/logs/loginaccess.log"
debug => true
}
file {
type => "proxy_log"
path => "/home/jws/app/nginxserver/logs/proxyaccess.log"
debug => true
}
}
output {
redis {
host => "10.20.164.121"
data_type => "list"
key => "logstash:redis"
}
redis {
host => "10.20.164.122"
data_type => "list"
key => "logstash:uop_file"
}
}
啓動shipper:
java -jar /home/jws/htdocs/logstash/lib/logstash.jar agent -f /home/jws/htdocs/logstash/conf/logstash.conf -l /home/jws/htdocs/logstash/logs/logstash.log
例如以下indexer中的配置,並啓動indexer:
input {
file {
path => "/home/rsyslog/asaserver/*/*/*/proxy.log.*"
exclude => "*.bz2"
type => "proxy"
}
}
filter {
grok {
match => [ "message", "%{APIPROXY}" ]
patterns_dir => ["/home/jws/app/logstash/patterns"]
}
if [request_uripath_orig]{
grok {
match => [ "request_uripath_orig", "%{NSSS}" ]
patterns_dir => ["/home/jws/app/logstash/patterns"]
}
}
}
output {
#stdout { codec =>"rubydebug"}
elasticsearch_http {
host => "10.20.161.36"
flush_size => 500
idle_flush_time => 3
index => "logstash_pf_proxy-%{+YYYY.MM.dd.HH}"
template => "/home/jws/app/logstash/template/t.json"
template_overwrite => true
}
}
5、安裝並啓動kibana3,安裝過程與普通軟件安裝無異,可以配合nginx安裝,這裏不做描述,需要注意的是需要在kibana config.js中配置elasticSearch的地址與端口。
注意紅框中的內容,這只是kibana3的默認界面,需要我們用logstash.json代替default.json界面,具體目錄源碼目錄下app/dashboards中。
例如項目中的一個例子,根據需求製作圖表(類似餅圖,柱狀圖,折線圖等),在筆者實際項目中,從日誌中分析數據,實現系統穩定性、響應時間、請求量、業務響應碼、HTTP狀態碼等等以kibana展現;
並且,elasticsearch的用途遠不如此,可以用來做搜索數據源,ES提供了編程接口,可以使用編程的方式獲取ES中的數據自定義開發監控程序,靈活且功能強大。
官方文檔(現在都整合在一起了):
logstash:https://www.elastic.co/guide/en/logstash/current/index.html
elasticsearch:https://www.elastic.co/
kibana:https://www.elastic.co/