ELK結合logback搭建日誌中心
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,就是這麼任性~
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)
Logstash安裝
-
下載logstash並解壓,推薦使用最新版本
-
建立simple.conf檔案,並編寫測試conf
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打印出來則安裝成功
Elasticsearch安裝
ElasticSearch預設的對外服務的HTTP埠是9200,節點間互動的TCP埠是9300(這個可以自配置),注意開啟tcp埠
-
先下載並解壓
-
安裝mobz/elasticsearch-head外掛
-
啟動logstash並測試 elasticsearch
注意:啟動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
啟動起來的介面是:
接下來就要安裝kibana了
Kibana安裝
[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埠。
ELK+logback結合
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>
寫一個測試程式:
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模式
/home/colin/logstash-2.3.1/bin/logstash -f simple.conf --debug
這裡可能因為buffer大小的原因不能flush,多執行幾次就好了,timestamp會相差8小時,沒有什麼影響,在kibana會顯示正常
使用kibana來檢視相應的結果
待改進和學習的地方
-
需要加上收集的緩衝元件。如 redis,kafka等
-
配置檔案可以配置niginx,linux,jvm等日誌
-
報表視覺化熟練