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

修改配置文件
進入 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 # 如果內存夠用也可以不修改 -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/

新增數據并查詢
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端口進行采集日志
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 應用的日志輸出。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>
其實這個依賴就是用來網絡通信的,來傳輸日志。
測試
這時啟動應用,觀看 Logstash 的控制臺,會跟著打印日志,再打開 ES ,創(chuàng)建我們配置好的查詢索引,神奇的事情發(fā)生了,日志一條一條的展示出來。

再結合 TraceId 進行搜索,簡直逆天!

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)控日志文件有沒有新增來同步數據的,所以需要配置日志文件的目錄。
可以直接輸出到 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ā)現日志已寫入文件

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

最后
內容看著比較多,實際很容易實現,但真正生產環(huán)境要復雜的多,還需不斷思考。
以上就是功能強大的TraceId 搭配 ELK使用詳解的詳細內容,更多關于TraceId 搭配 ELK的資料請關注腳本之家其它相關文章!
相關文章
劍指Offer之Java算法習題精講數組與列表的查找及字符串轉換
跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現質的變化2022-03-03
java并發(fā)編程之深入理解Synchronized的使用
文詳細講述了線程、進程的關系及在操作系統中的表現,這是多線程學習必須了解的基礎。本文將接著講一下Java線程同步中的一個重要的概念synchronized,希望能夠給你有所幫助2021-06-06
springmvc不進入Controller導致404的問題
這篇文章主要介紹了springmvc不進入Controller導致404的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

