ELK簡介ELKStack即Elasticsearch + Logstash + Kibana。日誌監控和分析在保障業務穩定運行時,起到了很重要的做用。好比對nginx日誌的監控分析,nginx是有日誌文件的,它的每一個請求的狀態等都有日誌文件進行記錄,因此能夠經過讀取日誌文件來分析;redis的list結構正好能夠做爲隊列使用,用來存儲logstash傳輸的日誌數據。而後elasticsearch就能夠進行分析和查詢了。
本文搭建的的是一個分佈式的日誌收集和分析系統。logstash有agent和indexer兩個角色。對於agent角色,放在單獨的web機器上面,而後這個agent不斷地讀取nginx的日誌文件,每當它讀到新的日誌信息之後,就將日誌傳送到網絡上的一臺redis隊列上。對於隊列上的這些未處理的日誌,有不一樣的幾臺logstash indexer進行接收和分析。分析以後存儲到elasticsearch進行搜索分析。再由統一的kibana進行日誌web界面的展現。
以上爲抄襲!!!
好吧,讓咱們切入正題:java
首先咱們須要一臺linux機器,緊哥其實很是不喜歡在window下安裝軟件,hoho~
固然咱們也默認你已經安裝了java,建議版本是使用1.8,可是我使用的是1.7,就是這麼任性~linux
colin@colindev:~$ java -version java version "1.7.0_21" Java(TM) SE Runtime Environment (build 1.7.0_21-b11) Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
input { stdin { } } output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
colin@colindev:~$ wget https://download.elastic.co/logstash/logstash/logstash-2.3.1.tar.gz colin@colindev:~$ tar -zvxf logstash-2.3.1.tar.gz colin@colindev:~$ vim simple.conf colin@colindev:~$ /home/colin/logstash-2.3.1/bin/logstash -f simple.conf --debug
3.能夠看到logstash已經運行,輸入hello world會有log打印出來則安裝成功nginx
ElasticSearch默認的對外服務的HTTP端口是9200,節點間交互的TCP端口是9300(這個能夠自配置),注意打開tcp端口git
注意:啓動elasticsearch的話不能用root帳號哈~
colin@colindev:~$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.tar.gz colin@colindev:~$ tar -zxvf elasticsearch-1.7.1.tar.gz [colin@colindev:bin ]$ ./plugin install mobz/elasticsearch-head [colin@colindev bin]$ elasticsearch start
啓動起來的界面是:github
接下來就要安裝kibana了web
[root@hadoop-slave ~]# wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz [root@hadoop-slave elk]# tar -zxf kibana-4.1.1-linux-x64.tar.gz [root@hadoop-slave elk]# mv kibana-4.1.1-linux-x64 /usr/local/elk [root@hadoop-slave bin]# pwd /usr/local/elk/kibana/bin [root@hadoop-slave bin]# ./kibana &
打開http://localhost:5601/
若是須要遠程訪問,須要打開iptables的tcp的5601端口。redis
input { tcp { host => "192.168.1.167" port => 9250 mode => "server" tags => ["tags"] codec => json_lines //可能須要更新logstash插件 } } output { stdout{codec =>rubydebug} elasticsearch { hosts => ["localhost:9200"] //這塊配置須要帶端口號 flush_size => 1000 } }
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property resource="properties/logback-variables.properties" /> <!-- 獲得APP_NAME log_path的值 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="UTF-8"> <!-- encoder 能夠指定字符集,對於中文輸出有意義 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n </pattern> </encoder> </appender> <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>192.168.1.167:9250</destination> <!-- encoder is required --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <!--<appender name="async" class="ch.qos.logback.classic.AsyncAppender">--> <!--<appender-ref ref="stash" />--> <!--</appender>--> <root level="info"> <!-- 設置日誌級別 --> <appender-ref ref="STDOUT" /> <appender-ref ref="stash" /> </root> </configuration>
寫一個測試程序:shell
import org.junit.Test; import org.slf4j.LoggerFactory; /** * Created by colinsu on 2016/4/14. */ public class LogstashTest { private static final org.slf4j.Logger LGR = LoggerFactory.getLogger(LogstashTest.class); @Test public void test() { LogstashTest obj = new LogstashTest(); try{ obj.divide(); }catch(ArithmeticException ex){ LGR.error("你們好111!", ex); } } private void divide(){ int i = 10 /0; } }
使用logstash debug模式json
/home/colin/logstash-2.3.1/bin/logstash -f simple.conf --debug
這裏可能由於buffer大小的緣由不能flush,多執行幾回就行了,timestamp會相差8小時,沒有什麼影響,在kibana會顯示正常
vim