使用 ELK 收集日志
在當(dāng)前分布式、微服務(wù)架構(gòu)下,各個(gè)應(yīng)用都部署在不同的服務(wù)器上,每個(gè)應(yīng)用都在記錄著自己重要或者不重要的日志信息。當(dāng)我們要通過日志信息來排查錯(cuò)誤時(shí),可以根據(jù)出錯(cuò)應(yīng)用在對(duì)應(yīng)的機(jī)器上找報(bào)錯(cuò)相關(guān)的日志信息。但是,可能我們不具有相應(yīng)服務(wù)器的訪問權(quán)限,也可能相同的應(yīng)用部署在多臺(tái)服務(wù)器上,導(dǎo)致根本不知道在哪臺(tái)服務(wù)器上找日志。遇到類似這樣的尷尬,想要通過日志來排查錯(cuò)誤就搞得很麻煩。在這種情況下,ELK 為我們提供了統(tǒng)一的日志管理解決方案,它能很好的支持 Logback 等日志框架,使得我們可以集中的管理不同應(yīng)用輸出的日志信息。
ELK 是 ElasticSearch、Logstash 和 Kibana 的簡寫。ElasticSearch 主要用來存儲(chǔ)日志信息,并提供檢索功能;Logstash 用于收集應(yīng)用發(fā)送的日志信息,并寫入到 ElasticSearch 當(dāng)中;Kibana 是一個(gè)可視化的日志查看、分析工具。
ELK 架構(gòu)大體如下:

在上圖中應(yīng)用日志框架直接將日志發(fā)送給 Logstash,然后 Logstash 將接收的日志寫入 ElasticSearch 中,開發(fā)人員通過可視化的 Kibana 可以進(jìn)行日志的查詢和分析。
在上圖中,Logstash、ElasticSearch 都可以是多個(gè),而不是一個(gè)。
ELK 的下載
ELK 都可以通過它們的官網(wǎng)進(jìn)行下載,最好將它們的版本進(jìn)行統(tǒng)一。我這里下載的是 7.17.6 的版本,即 ElasticSearch、Logstash 和 Kibana 都是 7.17.6 版本的。
它們的下載地址分別如下:
- elasticsearch下載地址:
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-6
- logstash下載地址:
https://www.elastic.co/cn/downloads/past-releases/logstash-7-17-6
- kibana下載地址:
https://www.elastic.co/cn/downloads/past-releases/kibana-7-17-6
ELK 下載后只需要解壓縮后進(jìn)行配置即可使用,還是很方便的。
ELK 的配置與啟動(dòng)
我這里使用的是 Windows 系統(tǒng)進(jìn)行演示,在將 ELK 配置好后直接使用命令行進(jìn)行啟動(dòng),并沒有將其注冊(cè)為服務(wù)。
ElasticSearch 的配置與啟動(dòng)
在 ES 的安裝目錄下有個(gè) config 目錄,打開該目錄下的 elasticsearch.yml 文件,然后取消掉兩行配置的注釋符號(hào),并進(jìn)行簡單的修改,配置如下:
network.host: 0.0.0.0discovery.seed_hosts: ["127.0.0.1", "[::1]"]
在 ES 的安裝目錄下打開命令行執(zhí)行以下命令,來啟動(dòng) ES:
.\bin\elasticsearch.batLogstash 的配置與啟動(dòng)
在 Logstash 的安裝目錄下同樣有一個(gè) config 目錄,復(fù)制 logstash-sample.conf 配置文件,并命名為 log_to_es.conf,文件名可以自己定,啟動(dòng)時(shí)寫對(duì)即可。
修改配置如下:
input {beats {port => 5044}tcp {host => "0.0.0.0"port => 8082mode => "server"tags => ["bsjiot"]codec => json_lines}}output {elasticsearch {hosts => ["http://localhost:9200"]}}
其中 input 是用于收集日志信息的配置,output 是用于將收集的信息推送到 ES 中。通過命令行來啟動(dòng) Logstash,命令如下:
.\bin\logstash.bat -f .\config\log_to_es.confKibana 的配置與啟動(dòng)
在 Kibana 的安裝目錄下也同樣有一個(gè) config 目錄,修改該目錄下的 kibana.yml 文件,配置如下:
elasticsearch.hosts: ["http://localhost:9200"]server.host: "127.0.0.1"
通過在命令行如下命令啟動(dòng) Kibana,命令如下:
.\bin\kibana.bat通過 Logback 輸出日志到 ELK
上面配置完 ELK 并啟動(dòng)后,通過 SpringBoot 來進(jìn)行測試。
首先引入兩個(gè)依賴,引入依賴如下:
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.2</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency>
接下來配置 Logback 的配置文件:
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>localhost:8082</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"><customFields>{"appname":"xxxx"}</customFields></encoder></appender><root level="info"><appender-ref ref="CONSOLE" /><appender-ref ref="LOGSTASH" /></root>
最后通過 Logback 來輸出一些日志,然后在 Kibana 中進(jìn)行查看。
通過 Kibana 查看日志
我們來訪問 Kibana 提供的 Web 頁面,瀏覽器中打開 http://localhost:5601/ 該地址。然后在左側(cè)列表中選擇 Stack Managentment,選擇后會(huì)出現(xiàn)新的頁面,然后選擇 Index Patterns 選項(xiàng)。在新出現(xiàn)的頁面中點(diǎn)擊 Create Index pattern 按鈕,然后命名其為 logstash-*(這里名字隨意),并選擇 @timestamp 的字段,如下圖:

選擇好后,點(diǎn)擊 Create index pattern 按鈕即可。創(chuàng)建完成后,返回 Kibana 的首頁,選擇 Discover 選項(xiàng),切換到我們新建的 logstash-* 選項(xiàng)下,然后選擇時(shí)間段,就可以看到相應(yīng)的日志信息了。
小結(jié)
上例中 ELK 都部署在了一臺(tái)機(jī)器上,Demo 演示而已。實(shí)際情況中,ELK 可能部署在多臺(tái)機(jī)器上,且可以配置集群。當(dāng)微服務(wù)等客戶端特別多時(shí),同時(shí)向 Logstash 發(fā)送數(shù)據(jù),并寫入 ES 可能會(huì)影響性能,此時(shí)可以在客戶端和 Logstash 中間引入 Kafka 來緩解 Logstash 和 ES 的壓力。

公眾號(hào)內(nèi)回復(fù) 【mongo】 下載 SpringBoot 整合操作 MongoDB 的文檔。
公眾號(hào)內(nèi)回復(fù) 【cisp知識(shí)整理】 下載 CISP 讀書筆記。
公眾號(hào)內(nèi)回復(fù)【java開發(fā)手冊(cè)】獲取《Java開發(fā)手冊(cè)》黃山版。
