公司需要做日誌集中管理和檢索,所以採用了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吧。