ELK是Elasticsearch
、Logstash
、kibana
三個開源庫的首字母縮寫,這三個庫的主要功能分別以下:Elasticsearch
用於日誌存儲、分析、搜索等功能;Logstash
主要用於收集、修改、傳輸日誌; kibana
用於可視化提供友好的數據分析界面。html
本文使用docker
搭建一個相對比較簡單ELK日誌系統,本文假設讀者對如下知識有基本的瞭解:nginx
首先需須要有一個SpringBoot
的工程來產生一些日誌,這裏直接延用之前的工程(AppBubbleBackend),若有興趣可查看原文《SpringBoot集成gRPC微服務工程搭建實踐》,工程的搭建和docker
想着的知識就不作過多的補充了,本文所提到的ELK配置到放在AppBubbleBackend/scripts/elk
目錄下。git
示例使用SpringBoot工程集成Logback日誌庫來產生日誌,首先要引用相關信賴:github
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
複製代碼
logback-classic
和logback-core
是Logback提供的類庫,logstash-logback-encoder
提供一些類庫來處理日誌,主要用於格式化Logback的日誌併發送到Logstash服務器。spring
配置好Logback
依賴後,SpringBoot
會自動使用Logback
替換掉的默認日誌系統, 這樣只須要在配置下logstash-logback-encoder
將日誌正確的發送的Logstash
就能夠了。根據SpringBoot
的日誌管理模式在resources
目錄下新建一個logback-spring.xml
的日誌配置文件內容以下:docker
<configuration>
<springProperty scope="local" name="appname" source="spring.application.name" defaultValue="undefined"/>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>logstash:4560</destination>
<!-- encoder is required -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"${appname}"}</customFields>
</encoder>
</appender>
<root level="TRACE">
<appender-ref ref="logstash"/>
</root>
<logger name="com.bubble" level="TRACE"/>
<logger name="com.bubble.user" />
<logger name="com.bubble.common" />
</configuration>
複製代碼
以上配置文件使用net.logstash.logback.appender.LogstashTcpSocketAppender
創建一個Appender
,將destination
設置爲Logstash
服務器的地址,並添加一個自定義參數appname
後面再來介紹這個字段。json
配置完依賴和Logback
以後,日誌都發送到LogstashTcpSocketAppender
,它會處理日誌併發送的Logstash
服務器。ruby
上面提到過日誌經過LogstashTcpSocketAppender
處理併發送到Logstash
服務器,接下來就須要配置一個Logstash
來接收日誌。Logstash
的配置分爲logstash.yml
和pipeline
兩類配置,logstash.yml
不須要太多的配置咱們使用默認的配置就夠了,pipeline
的配置能夠分爲input
、filter
和output
兩個主要的配置模塊,它們的主要功能分別爲:input
主要用來接收日誌;filter
用來修改日誌;output
將日誌發送到目的地。bash
在logback-spring.xml
日誌配置文件中使用的LogstashTcpSocketAppender
來發送日誌並配置了Logstash
的地址爲logstash:4560
因此在pipeline
的配置中首先須要添加一個接收日誌的input
:服務器
input {
tcp {
port => 4560
codec => json_lines
id => "main"
}
}
複製代碼
而後在添加一個output
將日誌發送到Elasticsearch
:
output {
#stdout { codec => rubydebug { metadata => true } }
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "logstash-services-%{+YYYY.MM.dd}"
}
}
複製代碼
output
使用elasticsearch這個插件並指定elasticsearch
服務器地址,最後將index的名稱設置logstash-services-%{+YYYY.MM.dd}
的格式,這樣index的名稱將會是logstash-services-2019.03.18
的形式。
Logstash
的配置可參考官方文檔:
Elasticsearch
的配置相對於前面兩個稍微複雜一些,這次主要測試目的直接使用默認的配置。將Elasticsearch
啓動後,若是Logstash
配置正確就可使用 Get Index API 來獲取index的信息。
查看2019.03.16
這條的index信息:
curl http://elasticsearch:9200/logstash-services-2019.03.16
複製代碼
由於在配置logback-spring.xml
的時候,添加了一個自定義的參數appname
因此能夠經過使用appname
來查詢日誌:
curl http://localhost:9200/logstash-*/_search?pretty -X GET -H 'Content-Type: application/json' -d '{"query":{"match":{"appname":{"query":"AppBubbleUserService"}}}}'
複製代碼
以上命令執行完後可看到相似以下輸出,說明日誌已經成功發送到elasticsearch
:
{
"_index" : "logstash-services-2019.03.18",
"_type" : "doc",
"_id" : "6ksRj2kBJ7x4nqLIOHp6",
"_score" : 0.0011799411,
"_source" : {
"thread_name" : "main",
"@version" : "1",
"level" : "TRACE",
"appname" : "AppBubbleUserService",
"host" : "appbubblebackend_user_1.appbubblebackend_default",
"port" : 56952,
"level_value" : 5000,
"logger_name" : "org.springframework.boot.context.config.ConfigFileApplicationListener",
"@timestamp" : "2019-03-18T04:31:02.983Z",
"message" : "Skipped missing config classpath:/application-default.xml for profile default"
}
複製代碼
日誌被成功發送到elasticsearch
後就可使用kibana
來查看搜索日誌了。添加一個簡單的配置文件:
elasticsearch:
hosts:
- "http://elasticsearch:9200"
server:
name: "kibana"
host: 0.0.0.0
複製代碼
配置好elasticsearch
服務器的地址,而後啓動kibana
再添加一個Index Patterns
,依次點擊 Management
>> Index Patterns
>> Create index pattern
建立一個index pattern
。
添加成功進入Discover
頁面,在下拉框中選擇新建的index便可看到以下所示的輸出日誌:
kibana
還有不少強大的功能,後續再來繼續探索。
使用elk處理分析日誌相比較傳統的日誌處理方式可大大提升日誌的檢索效率,若是要在生產環境中使用還須要更加深刻的學習和詳細的配置方案。後續的學習和使用中會繼續深刻學習Elasticsearch
、Logstash
的相關知識,同時對不於不支持發送遠程日誌的工具後續會使用beats
來接入日誌系統, 如envoy
或nginx
就可使用filebeat
來將日誌發送到Logstash
來查看訪問日誌。