Logback + Logstash + Elasticsearch + Kibana 日誌檢索平臺填坑記

公司需要做日誌集中管理和檢索,所以採用了Logback + ELK方案。由於是第一次接觸ELK,遇到不少坑,整整花了一天才徹底搞通。本文elk的版本是6.3.2。

根據其它網上文章,一一安裝和配置各組件。

1. 下載並啓動elasticsearch,es不用修改配置,直接運行即可:./bin/elasticsearch。

運行成功後,在瀏覽器打開網址:http://127.0.0.1:9200,如果看到如下信息,說明啓動成功

{
  "name" : "uAPjUu9",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "tSq1s58NQdCBfJ2Aoo_LtA",
  "version" : {
    "number" : "6.3.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "053779d",
    "build_date" : "2018-07-20T05:20:23.451332Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

2. 下載logstash,logstash是要新建配置文件:touch config/my-logstash.conf, 由於要接入logback,因此可做如下配置:

input {
    tcp {
        port => 4567
        codec => "json_lines"
    }
}

output {
  stdout {
    codec => "rubydebug"
  }
  elasticsearch {
    hosts => "127.0.0.1"
    index => "logback-%{+YYYY.MM.dd}"
  }
}

配置完後啓動logstash:./bin/logstash -f ./config/my-logstash.conf

3. 下載kibana,修改配置文件:vi config/kibana.yml,  在文件最後,添加

elasticsearch.url: "http://localhost:9200"
server.host: 0.0.0.0

修改完成後運行kinana:./bin/kibana 

4. 在瀏覽器打開kibana系統:http://localhost:5601

好了,上面所有的安裝配置都超級簡單,到這裏,大家一定暗喜如此簡單就搞定了elk。對於像我這樣對es從來沒接觸過的人,一定會遇到大坑。

kibana 此時會提示需要首先創建 index patern。好吧,我門老老實實去添加。如果大家細心的話,旁邊會有一句提示:You'll need to index some data into Elasticsearch before you can create an index pattern。所以,會有這幾種情況:

a。沒有看提示,直接就去創建index patern。會發現無論輸什麼,next step按鈕始終是灰色的。上網一搜,才發現index pattern中的index必須是在es中存在的index。所以接下來就會想辦法在es中創建index,最後找到2種方法,在終端採用cur命令調用es提供的rest接口去操作,或者簡單地在kibana的dev tools中輸入命令去操作。index創建成功後,回到index pattern創建的頁面,發現,仍然不行!!!奔潰!!!而且而且,由於es中已經創建了index,你將永遠無法再看到You'll need to index some data into Elasticsearch before you can create an index pattern 這句提示。問題是,這句提示太太太太太太重要了,它的意思是,必須先存入一部分帶有索引的數據到es中,才能創建index pattern

b。假如看到了那句提示,也會蒙圈,老子什麼都不懂,你就讓我輸入帶有索引的數據,我怎麼知道數據格式是什麼。然後在網上找到一篇官方教程:Loading Simple Data,點擊進去也很蒙圈,爲什麼要導入這樣的數據,這樣的數據我們根本不需要。沒辦法,既然什麼都不懂,那麼照貓畫虎先搞吧。果然,數據弄進去後發現,真的可以創建index parrern了。這時才搞清楚,導入數據時,es會自動創建好多index。那麼爲什麼手動創建index就不行呢呢呢呢呢呢呢????

總算有點感覺了,這時,我們開始配置logback:

a。配置maven

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        
        <!-- Logstash encoder -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>5.2</version>
		</dependency>

b。配置logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
    debug="false" scan="true" scanPeriod="30 second">
	
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>%d{yyyyMMdd'T'HH:mm:ss.SSS} [%thread] %-5level %logger{36}- %msg%n</pattern>
		</encoder>
	</appender>

  	<appender name="logstash"
		class="net.logstash.logback.appender.LogstashTcpSocketAppender">
		<destination>127.0.0.1:4567</destination>
		<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
		</encoder>
	</appender>

	<root level="trace">
		<appender-ref ref="STDOUT"/>
		<appender-ref ref="stash"/>
	</root>
	
</configuration>

c。寫logback的代碼,輸出日誌,發現怎麼樣都無法輸出到logstash,但是控制檯卻能正常打印日誌。絕望!!!終於,在網上找到替代方法,不要用net.logstash.logback.encoder.LogstashEncoder, 改成用logback原生的Encoder:

<appender name="logstash"
	class="net.logstash.logback.appender.LogstashTcpSocketAppender">
	<destination>127.0.0.1:4567</destination>
	<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
		<providers>
			<timestamp/>
			<version/>
			<message/>
			<loggerName/>
			<threadName/>
			<logLevel/>
			<callerData/>
		</providers>
	</encoder>
</appender>

d。這時,在logstash控制檯發現會有這樣的打印:

{
        "message" => "test trace1",
           "port" => 56480,
     "@timestamp" => 2018-08-09T13:04:08.213Z,
    "logger_name" => "com.yingzi.lib.logging.TestLogging",
       "@version" => "1",
    "thread_name" => "main",
           "host" => "localhost",
          "level" => "TRACE"
}

e。在es控制檯有這樣的打印:

[2018-08-09T19:49:17,892][INFO ][o.e.c.m.MetaDataIndexTemplateService] [uAPjUu9] adding template [kibana_index_template:.kibana] for index patterns [.kibana]

f。回到kibana,可以創建index pattern:logback-*,這時因爲logstash中index我們配置index成這樣:logback-%{+YYYY.MM.dd}

g。配置index pattern後,我們可以在 Discover中查詢我們剛纔在logback那裏輸出的日誌了。

 

總結:其實不需要Loading Sample Data,elk配置好之後,直接配置logback工程,直接輸出日誌即可。elk必須要先有數據,才能建index pattern,才能根據index pattern搜索日誌。但是,只要有數據即可,什麼數據無所謂,所以 loading sample data是完全沒有必要的。

好了,坑暫時填到現在,繼續研究elk吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章