Logstash+Redis+Elasticsearch+Kibana+Nginx搭建日志分析系統
來自: http://my.oschina.net/52love/blog/628513
前言:
隨著實時分析技術的發展及成本的降低,用戶已經不僅僅滿足于離線分析。目前我們服務的用戶包括微博、微盤、云存儲、彈性計算平臺等十多個部門的多個產品的日志搜索分析業務,每天處理約32億條(2TB)日志。哈哈 以上都是新浪的信息~不是我們小公司的分析業務規模。
當然為了使得運行在客戶端的軟件有良好的體驗,并且得到有用的數據,我們需要對這些系統產生的數據,進行統計和分析,這個過程通常包括數據采集,清洗,建模,分析,報表等。接下來在本篇文章中,將會構建一個基于logstash,redis,elasticSearch,kibana的一套數據收集分析的系統。
平臺架構:
nginx作為前端服務器 生成業日志,logstash實時的從業務日志中數據數據(可以進行響應的過濾,一個Logstash進程可以有多個輸入源,所以一個Logstash進程可以應付一臺服務器上的所有日志),然后把數據輸入到redis中,redis只做消息隊列不對消息做處理和存儲(Redis是Logstash官方推薦的Broker角色“人選”,支持訂閱發布和隊列兩種數據傳輸模式),然后redis會把數據轉給elasticSearch(同時可以對錯誤信息進行過濾 發送郵件提醒),elasticSearch會對數據做存儲,索引(基于Lunce),再kibana中建立對elasticSearch的鏈接,實時的抓取索索引后的數據,這樣數據就可以實時的進行展示,通過一些數據組裝,查詢條件,得到我們想要的結果(可以通過各種方式例如圖表,表格,折線圖等顯示)
效果展示:
再看一下以前我們是如何查看日志的:
線上日志逐個tail+grep
編寫腳本,下載某個時間范圍內的全部日志到本地再搜索
tail+grep或者把日志下載下來再搜索,可以應付不多的主機和不多的應用部署場景。但對于多機多應用部署就不合適了。這里的多機多應用指的是同一種應用被部署到幾臺服務器上,每臺服務器上又部署著不同的多個應用。可以想象,這種場景下,為了監控或者搜索某段日志,需要登陸多臺服務器,執行多個tail -F和grep命令。一方面這很被動。另一方面,效率非常低,數次操作下來,你心情也會變糟。是不是看的眼花料哦亂~
系統版本 阿里云 centos 6.5 64位
軟件版本 (版本更新頻繁并且各個軟件之間兼容性有問題,主要是elk之間的,經測試一下版本可以使用)
logstash-2.1.1,elasticsearch-2.1.0,redis-2.8.4,kibana-4.3.1-linux-x64
一、安裝logstash
linux下 直接 wget https://download.elastic.co/logs ... gstash-2.1.1.tar.gz
然后解壓 tar -zxvf logstash-2.1.1.tar.gz 即可。
二、安裝elasticsearch
linux下安裝elasticsearch :http://www.52itstyle.com/thread-20114-1-1.html
三、安裝 redis
linux下redis安裝和使用:http://www.52itstyle.com/thread-20084-1-1.html
四、安裝kibana
linux下安裝kibana:http://www.52itstyle.com/thread-20127-1-1.html
以上軟件 啟動方式見鏈接。
這里主要說一下 如何收集Tomcat異常日志:
一、比如我們的日志 放在tomcat/log目錄下 異常日志格式為
52itstyle_error.2016-03-01.txt #異常信息
二、編寫logstash shipper 收集日志信息
input { file { type => "tomcat_itstyle" tags => [ "tomcat_error", "log4j" ] path => "/tomcat7/log/*error*.txt" } } filter { if [type] == "tomcat_itstyle" { grok { match => { "message" => "(?m)%{TIMESTAMP_ISO8601:logtime}" } } multiline { pattern => "^[^\[]" what => "previous" } mutate { split => ["message", "|"] } } } output { stdout { codec => rubydebug } redis { host => "127.0.0.1" port => 6379 data_type => "list" key => "logstash-tomcat-error" password => "123456" db => 0 } }
二、編寫logstash indexer整理日志信息
input { redis { host => "127.0.0.1" port => 6379 data_type => "list" key => "logstash-tomcat-error" type => "redis-input" password => "123456" db => 0 } } output { elasticsearch { hosts => ["127.0.0.1:9200"] } exec { #發送錯誤日志 到指定郵件 command => "echo '%{@timestamp} %{type}: %{message}' | mail -s tomcat_error_message 345849402@qq.com" } }
分別啟動 indexer 和 shipper
切換到 logstash/bin 下執行一下命令
./logstash -f indexer.conf &
./logstash -f shipper .conf &