功能強(qiáng)大的TraceId?搭配?ELK使用詳解
引言
之前寫了一篇關(guān)于 TraceId 的文章:為全局請求添加 TraceId ,看日志再也不懵逼
今天就接著 TraceId 做一些優(yōu)化,如果想快速的定位到問題,就要實現(xiàn)對日志的快速搜索,所以本文就引入 ELK 技術(shù)棧。
ELK 是 ES、Logstash、Kibana 的總稱,其核心功能就是實現(xiàn)數(shù)據(jù)的收集、搜索、可視化。具體功能和使用在本文都會提到。
需求分析
先分析一下,我們想實現(xiàn)的核心功能是搜索,必然是用 ES 實現(xiàn),那問題就轉(zhuǎn)換成如何將日志收集并存儲到 ES。
日志大家都不陌生了,可以在控制臺打印,也可以存入文件,那能不能直接輸入 ES 呢,好像沒聽說過。
這里就要用到 Logstash 來收集日志,Spring 默認(rèn)的日志框架 Logback 已經(jīng)對其提供了支持,我們要做的只是編寫配置文件。
Logstash 有個問題就是非常占用內(nèi)存,所以本文后面會介紹另一個比較輕量級的日志收集工具 FileBeat ,由 Go 語言編寫。
同時對于真實的線上環(huán)境為了保證吞吐量和可靠性,都會引入 Kafka 進(jìn)行解耦,本文不做演示。
下面就進(jìn)入實戰(zhàn)部分,搭建一套日志收集與搜索系統(tǒng)。
ES
推薦大家去 elastic 的中文社區(qū)下載 ELK ,速度會比較快,官網(wǎng)當(dāng)然也是可以的。目前最新版本是8.+,推薦還是下 7.+ 比較穩(wěn)妥,具體版本隨意,但 ELK 的版本要一致。
本文使用 7.14.2 版本。下載下來解壓就行,不廢話。

修改配置文件
進(jìn)入 config 目錄:
# elasticsearch.yml path.data: /Users/li/programs/elasticsearch-7.14.2/data path.logs: /Users/li/programs/elasticsearch-7.14.2/logs ingest.geoip.downloader.enabled: false
# jvm.options # 如果內(nèi)存夠用也可以不修改 -Xms1g -Xmx1g
啟動
./bin/elasticsearch
[2022-09-13T10:54:10,015][INFO ][o.e.n.Node ] [LdeMacBook-Pro.mshome.net] started [2022-09-13T10:54:10,730][INFO ][o.e.l.LicenseService ] [LdeMacBook-Pro.mshome.net] license [b7a596e6-1b61-4e6d-af2f-7eab70fe693b] mode [basic] - valid
測試
瀏覽器訪問:http://localhost:9200/

kibana
下面再安裝 ES 的可視化工具,下載地址同上,版本號同上。

修改配置文件
# kibana.yml server.port: 5601 server.host: "localhost" elasticsearch.hosts: ["http://localhost:9200"] kibana.index: ".kibana" i18n.locale: "zh-CN" # 中文
啟動
./bin/kibana
[10:56:42.001] [info][status] Kibana is now degraded [10:56:44.784] [info][status] Kibana is now available (was degraded)
測試
瀏覽器訪問:http://localhost:5601/

新增數(shù)據(jù)并查詢
PUT /ecommerce/product/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
GET /ecommerce/product/1
Logstash
下載地址同上,版本號同上。

拷貝配置文件 logstash-sample.conf
# logstash-log-boot.conf
input {
tcp {
mode => "server"
host => "127.0.0.1"
# 通過監(jiān)聽9001端口進(jìn)行采集日志
port => 9001
codec => json_lines
}
}
output {
elasticsearch {
# ES的地址
hosts => ["http://127.0.0.1:9200"]
# 索引的名稱
index => "boot-log-collection-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
啟動
./bin/logstash -f ./config/logstash-log-boot.conf
Logback
OK,到此 ELK 就搭建完了,接下來就是配置 boot 應(yīng)用的日志輸出。logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} [%highlight(%-5level)] [%boldYellow(%X{traceId})] [%boldYellow(%thread)] %boldGreen(%logger{36} %F.%L) %msg%n">
</property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- 控制臺打印INFO及以上級別的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- LOGSTASH 日志收集-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 在logstash啟動文件logstash-log-boot.conf中配置的IP地址和端口 -->
<destination>127.0.0.1:9001</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root>
<appender-ref ref="STDOUT"/>
<!-- 引入LOGSTASH-->
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
如果報LogstashTcpSocketAppender這個類找不到,需要添加一個依賴:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
其實這個依賴就是用來網(wǎng)絡(luò)通信的,來傳輸日志。
測試
這時啟動應(yīng)用,觀看 Logstash 的控制臺,會跟著打印日志,再打開 ES ,創(chuàng)建我們配置好的查詢索引,神奇的事情發(fā)生了,日志一條一條的展示出來。

再結(jié)合 TraceId 進(jìn)行搜索,簡直逆天!

Filebeat
同樣是下載 FileBeat 。

修改配置文件
filebeat.inputs:
- type: log
enabled: true
paths:
- /Users/li/IdeaProjects/cloud-alibaba/cloud-service-commerce/commerce-user/log/*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 2
setup.kibana:
host: "localhost:5601"
output.elasticsearch:
hosts: ["localhost:9200"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
因為 Filebeat 是基于監(jiān)控日志文件有沒有新增來同步數(shù)據(jù)的,所以需要配置日志文件的目錄。
可以直接輸出到 ES ,也可以輸出到 Logstash 。二選一!
再配置 logback.xml
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件輸出位置-->
<File>/Users/li/IdeaProjects/cloud-alibaba/cloud-service-commerce/commerce-user/log/user.log</File>
<encoder>
<!--[%X{requestId}] 線程id,方便排查日志-->
<pattern>%date %level [%thread] [%X{requestId}] [%logger{36}.%method\(\):%line] %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 添加.gz 歷史日志會啟用壓縮 大大縮小日志文件所占空間 -->
<!--<fileNamePattern>/home/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>-->
<fileNamePattern>
/Users/li/IdeaProjects/cloud-alibaba/cloud-service-commerce/commerce-user/log/user-%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>3</maxHistory><!-- 保留 3 天日志 -->
</rollingPolicy>
</appender>
<root>
<appender-ref ref="FILE"/>
</root>
再次啟動項目,發(fā)現(xiàn)日志已寫入文件

進(jìn)入 ES 查詢,同樣查詢到日志。
經(jīng)過測試,F(xiàn)ileBeat 的日志收集延遲時間要比 Logstash 長,畢竟基于文件進(jìn)行同步,可以理解,而且本身業(yè)務(wù)實時性要求不高。

最后
內(nèi)容看著比較多,實際很容易實現(xiàn),但真正生產(chǎn)環(huán)境要復(fù)雜的多,還需不斷思考。
以上就是功能強(qiáng)大的TraceId 搭配 ELK使用詳解的詳細(xì)內(nèi)容,更多關(guān)于TraceId 搭配 ELK的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解
這篇文章主要介紹了Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
Java實現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式
這篇文章主要介紹了Java實現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java 微信公眾號開發(fā)相關(guān)總結(jié)
公眾號作為主流的自媒體平臺,有著不少人使用。這次以文本回復(fù)作為案例來講解Java相關(guān)的微信公眾號開發(fā)2021-05-05

