Lison
<dreamlison@163.com>
, v1.0.0
, 2024.4.03
Spring Cloud Alibaba-06-Sleuth鏈路追蹤
文章目錄
- Spring Cloud Alibaba-06-Sleuth鏈路追蹤
- 為什么使用鏈路追蹤
- 常見鏈路追蹤解決方案
- Sleuth概述
- 概述
- Sleuth術語
- Sleuth + Zipkin 原理
- Sleuth原理簡述
- Zipkin 原理簡述
- Sleuth快速上手
- Zipkin客戶端集成
- Zipkin服務端安裝(Docker方式持久化mysql、ES)
- 持久化MySql
- 持久化ES
- 集成
- 應用性能監控:通過 SkyWalking 實施鏈路追蹤
- APM 與 SkyWalking
- Sleuth+Zipkin 與 SkyWalking 對比
- 部署 SkyWalking 服務端
- 安裝 SkyWalking Java Agent
- 集成skywalking
- 使用探針方式啟動
為什么使用鏈路追蹤
隨著業務發展,微服務的數量也會越來越多,某個服務出現問題,問題很難排查
【問題】
1、鏈路梳理難:無法清晰地看到整個調用鏈路
2、故障難定位:無法快速定位到故障點、無法快速定位哪個環節比較費時
因此,我們需要鏈路追蹤來梳理鏈路調用,方便快速定位問題。分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請求還原成調用鏈路,進行日志記 錄,性能監控并將一次分布式請求的調用情況集中展示。比如各個服務節點上的耗時、請求具體到達哪 臺機器上、每個服務節點的請求狀態等等
常見鏈路追蹤解決方案
常見的有如下幾種解決方案,本文講解跟SpringCloud相關的Sleuth + Zipkin
【Zipkin】
Twitter開源的調用鏈分析工具,目前基于springcloud sleuth得到了廣泛的使用,特點是輕量,使用部署簡單
【Pinpoint】
韓國人開源的基于字節碼注入的調用鏈分析,以及應用監控分析工具。特點是支持多種插件,U功能強大,接入端無代碼侵入。
【SkyWalking】
本土開源的基于字節碼注入的調用鏈分析,以及應用監控分析工具。特點是支持多種插件,UI功能較強,接入端無代碼侵入。目前已加入Apache孵化器。
【CAT】
是大眾點評開源的基于編碼和配置的調用鏈分析,應用監控分析,日志采集,監控報警等一系列的監控平臺工具。
Sleuth概述
概述
sleuth是一個鏈路追蹤工具,通過它在日志中打印的信息可以分析出一個服務的調用鏈條,也可以得出鏈條中每個服務的耗時,這為我們在實際生產中,分析超時服務,分析服務調用關系,做服務治理提供幫助。
sleuth目前并不是對所有調用訪問都可以做鏈路追蹤,它目前支持的有:rxjava、feign、quartz、RestTemplate、zuul、hystrix、grpc、kafka、Opentracing、redis、Reator、circuitbreaker、spring的Scheduled。國內用的比較多的dubbo,sleuth無法對其提供支持。
Sleuth術語
請求一個微服務系統的API接口,這個API接口需要調用多個微服務單元,調用每個微服務單元都會產生一個新的Span,所有由這個請求產生的Span組成了這個Trace。整個過程使用Annotation(cs、sr、ss、cr)統計各個階段消耗的時長
-
Span
Span是基本工作單位。Span還包含了其他的信息,例如摘要、時間戳事件、Span的ID以及進程ID。SpanId用于唯一標識請求鏈路到達的各個服務組件。
-
Trace
由一組具有相同TraceId的span組成的樹狀結構,即一個完整的請求鏈路
-
Annotation
記錄一個請求的4個事件,用于計算各個環節消耗的時長
- cs (Client Sent ):客戶端發送一個請求,開始一個請求的生命。
- sr (Server Received ):服務端收到請求開始處理,sr - cs = 網絡延遲(服務調用的時間)
- ss(Server Sent ):服務端處理完畢準備發送到客戶端,ss - sr = 服務器處理請求所用時間
- cr (Client Received ):客戶端接收到服務端的響應,請求結束,cr - cs = 請求的總時間
Sleuth + Zipkin 原理
Sleuth原理簡述
【AOP攔截器的思想】
Sleuth創建TraceFilter,對所有的網絡請求進行攔截,如果請求的header中沒有span信息,則創建Span對象,生成span id、trace id等當前調用鏈的Trace信息記錄到Http Headers中,如果header中有,則直接使用header中的數據創建Span對象,之后將span id、trace id設置到sl4j的MDC中。這樣,我們在日志中就能看到span信息。
我們通過日志看到的信息其實只是sleuth收集信息的一小部分,在運行過程中,sleuth還會收集服務調用時間、接收到請求的時間、發起http請求的方法、http請求的路徑,包括請求的IP端口等信息,這些信息都會存入Span對象,然后發送到zipkin中。
Zipkin 原理簡述
Zipkin 是 Twitter 的一個開源項目,它基于Google Dapper實現,它致力于收集服務的定時數據, 以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。
我們可以使用它來收集各個服務器上請求鏈路的跟蹤數據,并通過它提供的REST API接口來輔助我 們查詢跟蹤數據以實現對分布式系統的監控程序,從而及時地發現系統中出現的延遲升高問題并找出系 統性能瓶頸的根源。
除了面向開發的 API 接口之外,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請 求鏈路明細,比如:可以查詢某段時間內各用戶請求的處理時間等。
Zipkin 提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra 以及 Elasticsearch
上圖展示了 Zipkin 的基礎架構,它主要由 4 個核心組件構成:
Collector:收集器組件,它主要用于處理從外部系統發送過來的跟蹤信息,將這些信息轉換為 Zipkin內部處理的 Span 格式,以支持后續的存儲、分析、展示等功能。
Storage:存儲組件,它主要對處理收集器接收到的跟蹤信息,默認會將這些信息存儲在內存中, 我們也可以修改此存儲策略,通過使用其他存儲組件將跟蹤信息存儲到數據庫中。
RESTful API:API 組件,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是外接 系統訪問以實現監控等。
Web UI:UI 組件, 基于API組件實現的上層應用。通過UI組件用戶可以方便而有直觀地查詢和分 析跟蹤信息。
Zipkin分為兩端,一個是 Zipkin服務端,一個是 Zipkin客戶端,客戶端也就是微服務的應用。 客戶端會 配置服務端的 URL 地址,一旦發生服務間的調用的時候,會被配置在微服務里面的 Sleuth 的監聽器監 聽,并生成相應的 Trace 和 Span 信息發送給服務端。
【原理】
1、Sleuth采用Brave(trancer庫)追蹤采集trace(由一組包含span信息的調用鏈組成)
2、將信息通過Zipkin的Collector發送給Zipkin
3、zipkin拿到信息后,將數據通過Storage持久化到數據庫/es中
3、Zipkin通過API提供數據給UI進行可視化展示
Sleuth快速上手
1、在需要追蹤的微服務上添加依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2、編寫配置
sleuth: sampler:rate: 100 # 指定采樣比例,默認10%
3、增加測試接口
@RequestMapping("/sentinel/message1")public String message1() {testSentinelMessage3Service.message();log.info("這是message1");return "message1";}
調用接口時,輸出以下日志:
2024-01-01 20:23:39.527 INFO [spring-cloud-service,9d701f5350d96c82,9d701f5350d96c82,true] 85218 --- [io-18001-exec-1] c.l.s.controller.TestSentinelController : 這是message1
可以看到,日志里出現了[spring-cloud-service,9d701f5350d96c82,9d701f5350d96c82,true]信息,這個就是由Spring Cloud Sleuth生成,用于跟蹤微服務請求鏈路。
這些信息包含了4個部分的值,它們的含義如下:
1、spring-cloud-service 微服務的名稱,與spring.application.name
對應;
2、9d701f5350d96c82 稱為Trace ID,在一條完整的請求鏈路中,這個值是固定的。觀察上面的日志即可證實這一點;
3、9d701f5350d96c82 稱為Span ID,它表示一個基本的工作單元;
4、true表示是否要將該信息輸出到Zipkin等服務中來收集和展示
Zipkin客戶端集成
雖然我們已經可以通過Trace ID來跟蹤整體請求鏈路了,但是我們還是得去各個系統中撈取日志。在并發較高得時候,日志是海量的,這個時候我們可以借助Zipkin來代替我們完成日志獲取與分析。Zipkin是Twitter的一個開源項目。
ZipKin客戶端和Sleuth的集成非常簡單,只需要在微服務中添加其依賴和配置即可。
Zipkin服務端安裝(Docker方式持久化mysql、ES)
持久化MySql
1、創建數據庫
如zipkin
2、建表
語句參考:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
或復制以下建表語句
--
-- Copyright The OpenZipkin Authors
-- SPDX-License-Identifier: Apache-2.0
--CREATE TABLE IF NOT EXISTS zipkin_spans (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL,`id` BIGINT NOT NULL,`name` VARCHAR(255) NOT NULL,`remote_service_name` VARCHAR(255),`parent_id` BIGINT,`debug` BIT(1),`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';CREATE TABLE IF NOT EXISTS zipkin_annotations (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';CREATE TABLE IF NOT EXISTS zipkin_dependencies (`day` DATE NOT NULL,`parent` VARCHAR(255) NOT NULL,`child` VARCHAR(255) NOT NULL,`call_count` BIGINT,`error_count` BIGINT,PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
3、修改啟動命令
Zipkin默認端口9411。
docker run \
--name zipkin-server -d \
--restart=always \
-p 9411:9411 \
-e MYSQL_USER=root \
-e MYSQL_PASS=123456 \
-e MYSQL_HOST=127.0.0.1 \
-e STORAGE_TYPE=mysql \
-e MYSQL_DB=zipkin \
-e MYSQL_TCP_PORT=3306 \
openzipkin/zipkin:2.21.7
持久化ES
若連接ES集群,–ES_HOSTS通過逗號分割,如:–ES_HOSTS=[http://192.168.0.1:9200,http://192.168.0.2:9200]
docker run \
--name zipkin-server -d \
-p 9411:9411 \
--restart=always \
-e STORAGE_TYPE=elasticsearch \
-e ES_HOSTS=localhost:9200
openzipkin/zipkin:2.21.7
連接ES參數
環境變量 | 描述 |
---|---|
ES_HOSTS | 連接ES地址,多個由逗號分隔。默認為http://localhost:9200 |
ES_PIPELINE | 指定span被索引之前的pipeline |
ES_TIMEOUT | 連接ES的超時時間,單位ms。默認為10000(10S) |
ES_INDEX | Zipkin持久化所使用的索引。默認為zipkin |
ES_DATE_SEPARATOR | Zipkin建立索引的日期分隔符。默認為- |
ES_INDEX_SHARDS | 分片(shard)個數,默認為5個 |
ES_INDEX_REPLICAS | 副本(replica)個數,默認為1個 |
ES_HTTP_LOGGING | ES的日志級別,可選值為BASIC, HEADERS, BODY |
ES_USERNAME/ES_PASSWORD | 登錄ES的用戶名和密碼 |
集成
1、在需要追蹤的微服務上添加依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、編寫配置
spring:zipkin:base-url: http://127.0.0.1:9411/ #zipkin server的請求地址 discoveryClientEnabled: false #讓nacos把它當成一個URL,而不要當做服務名 sleuth: sampler:probability: 1.0 #采樣的百分比
3、訪問微服務
http://127.0.0.1:18003/spring_building/naocs/consumer
4、訪問zipkin的UI界面,觀察效果
應用性能監控:通過 SkyWalking 實施鏈路追蹤
我們掌握了基于 Sleuth+Zipkin 對微服務架構實施基于日志的鏈路追蹤,通過 Sleuth 在微服務應用中附加鏈路數據,再通過 Zipkin 實現鏈路數據收集與可視化,從而保證開發與運維人員在生產環境了解微服務的執行過程與具體細節,為產品運維提供了有力的保障。
圍繞鏈路追蹤這個話題,介紹另一款著名的鏈路追蹤產品 SkyWalking,掌握 SkyWalking 的使用方法。本講咱們將介紹三方面內容:
APM 與 SkyWalking
Spring Cloud Slueth、Zipkin、阿里鷹眼、大眾點評 Cat、SkyWalking,這些產品都有一個共同的名字:APM(Application Performance Management),即應用性能管理系統,SkyWalking 這款 APM 產品,理由很簡單,它在簡單易用的前提下實現了比 Zipkin 功能更強大的鏈路追蹤、同時擁有更加友好、更詳細的監控項,并能自動生成可視化圖表。相比 Sleuth+Zipkin 這種不同廠商間混搭組合,SkyWalking 更符合國內軟件業的“一站式解決方案”的設計理念。
SkyWalking 是中國人吳晟(華為)開源的應用性能管理系統(APM)工具,使用Java語言開發,后來吳晟將其貢獻給 Apache,在 Apache 的背書下 SkyWalking 發展迅速,現在已屬于 Apache 旗下頂級開源項目,它的官網:http://skywalking.apache.org/。
SkyWalking 提供了分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。目前在 GitHub 上 SkyWaking 擁有 23.3K Star,最新版本為:9.7.0
鏈路追蹤視圖
指標監控全局視圖
Sleuth+Zipkin 與 SkyWalking 對比
Sleuth+Zipkin | SkyWalking | |
---|---|---|
鏈路追蹤可視化 | 有 | 有 |
聚合報表 | 很少 | 豐富 |
服務依賴圖 | 簡單依賴圖展示 | 形象直觀 |
監控埋點方式 | 侵入式,需要修改源碼 | 無侵入,采用Java Agent字節碼增強 |
Java VM指標監控 | 不具備 | 具備 |
支持報警 | 不支持 | 有,可以自定義報警方式 |
存儲機制 | 內存、MySQL,ES… | ES、Mysql、H2… |
文檔支持 | 文檔豐富,國外主流 | Apache支持,國內文檔更新滯后 |
國內案例 | 京東、阿里定制不開源… | 華為、小米、微眾銀行… |
通過比較我們可以發現,在易用性和使用體驗上,SkyWalking 明顯好于 Zipkin,功能更豐富的同時也更符合國人習慣,但因為迭代速度較快,社區文檔相對陳舊,這也導致很多技術問題需要程序員自己研究解決,因此在解決問題方面需要更多的時間。
部署 SkyWalking 服務端
skyWalkIng 架構圖
SkyWalking 同樣采用客戶端與服務端架構模式,SkyWalking 服務端用于接收來自 Java Agent 客戶端發來的鏈路跟蹤與指標數據,匯總統計后由 SkyWalking UI 負責展現。SkyWalking 服務端同時支持 gRPC 與 HTTP 兩種上報方式。其中 gRPC 默認監聽服務器 11800 端口,HTTP 默認監聽 12800 端口,而 SKyWalking UI 應用則默認監聽 8080 端口,這三個端口在生產環境下要在防火墻做放行配置。在存儲層面,SkyWalking 底層支持 ElasticSearch 、MySQL、H2等多種數據源,官方優先推薦使用 ElasticSearch
本初采用Docker的安裝方式
version: '3.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.6container_name: elasticsearchrestart: alwaysports:- 9200:9200- 9300:9300environment:- discovery.type=single-node- TZ=Asia/Shanghai- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"volumes:- /opt/data/dockerData/skywalking/elasticsearch/data:/usr/share/elasticsearch/dataulimits:memlock:soft: -1hard: -1oap:image: docker.io/apache/skywalking-oap-server:9.4.0container_name: oapdepends_on:- elasticsearchrestart: alwaysports:- 11800:11800- 12800:12800environment:SW_CORE_RECORD_DATA_TTL: 15SW_CORE_METRICS_DATA_TTL: 15SW_STORAGE: elasticsearchSW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200SW_ENABLE_UPDATE_UI_TEMPLATE: trueTZ: Asia/ShanghaiJAVA_OPTS: "-Xms2048m -Xmx2048m"ui:image: docker.io/apache/skywalking-ui:9.4.0container_name: uidepends_on:- oaplinks:- oaprestart: alwaysports:- 8080:8080environment:SW_OAP_ADDRESS: http://oap:12800SW_ZIPKIN_ADDRESS: http://oap:9412
docker compose up -d
啟動后會產生兩個 Java 進程:
- Skywalking-Collector 是數據收集服務,默認監聽 11800(gRPC)與 12800(HTTP) 端口。
- Skywalking-Webapp 是 SkyWalking UI,用于展示數據,默認監聽 8080 端口,上面顯示的為8038。
Skywalking 應用已啟動
啟動成功后,訪問[http://127.0.0.1:8088/],如果看到 SkyWalking UI 首頁,則說明服務端配置成功。
安裝 SkyWalking Java Agent
在前面提到,SkyWalking 可以在不修改應用源碼的前提下,無侵入的實現鏈路追蹤與 JVM 指標監控,它是怎么做到的?這里涉及一個 Java1.5 新增的特性,Java Agent 探針技術,想必對于很多工作多年 Java 工程師來說,Java Agent 也是一個陌生的東西。
Java Agent 探針說白了就是 Java 提供的一種“外掛”技術,允許在應用開發的時候在通過啟動時增加 javaagent 參數來外掛一些額外的程序。
Java Agent ,其擴展類有這嚴格的規范,必須創建名為 premain 的方法,該方法將在目標應用 main 方法前執行,下面就是最簡單的 Java Agent 擴展類。
public class SimpleAgent {public static void premain(String agentArgs, Instrumentation inst) {System.out.println("=========開始執行premain============");}
}
要完成 Java Agent,還需要提供正確的 MANIFEST.MF,以便 JVM 能夠選擇正確的類。在 META-INF 目錄下找到你的 MANIFEST.MF 文件:
Manifest-Version: 1.0
Premain-Class: com.lison.agent.SimpleAgent
之后我們將這個類打包為 agent.jar,假設原始應用為 test-agent.jar,在 test-agent.jar 啟動時需要在額外附加 javaagent 參數,如下所示:
java -javaagent:agent.jar -jar test-agent.jar
在應用啟動時 Java 控制臺會輸出如下日志。
=========開始執行 premain============
正在啟動 Agent測試服務...
....
SkyWalking 也是利用 Java Agent 的特性,在 premain 中通過字節碼增強技術對目標方法進行擴展,當目標方法執行時自動收集鏈路追蹤及監控數據并發往 SkyWalking 服務端。
SkyWalking Java Agent,我們還是以實例進行講解,因為 Java Agent 是無侵入的,并不需要源碼,這里我就直接給出調用關系圖幫助咱們理解。
調用關系圖
簡單介紹下,用戶訪問 a 服務的 a 接口,a 服務通過 OpenFeign 遠程調用 b 服務的 b 接口,b 服務通過 OpenFeign 調用 c 服務的 c 接口,最后 c 接口通過 JDBC 將業務數據存儲到 MySQL 數據庫
集成skywalking
1、下載解壓 agent
注意:agent版本和oap版本需要適配,版本不適配可能會出現頁面無法訪問、agent上報不到頁面等問題。
下載地址: https://skywalking.apache.org/downloads/
作者用的skywalking版本為9.4.0,下載v9.1.0版本的client沒有問題,親測可用。
需要配置skywalking-agent文件夾下,config/agent.config配置文件,列出最關鍵的兩個配置,其他配置大家可以自行探索。
agent.service_name=${SW_AGENT_NAME:HS}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.54.53:11800}
2、日志對接
在skywalking的UI端有一個日志的模塊,用于收集客戶端的日志,默認是沒有數據的,那么需要如何將日志數據傳輸到skywalking中呢?
<!--打印skywalking的TraceId到日志--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>9.1.0</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.1.0</version></dependency>
新建一個logback-spring.xml放在resource目錄下,配置如下:
<configuration debug="false" scan="false"><springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/><property name="log.path" value="logs/${spring.application.name}"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!-- 彩色日志依賴的渲染類 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- Console log output --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- Log file debug output --><appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/debug.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder></appender><!-- Log file error output --><appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter></appender><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--nacos 心跳 INFO 屏蔽--><logger name="com.alibaba.nacos" level="OFF"><appender-ref ref="error"/></logger><!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 --><root level="INFO"><!-- <appender-ref ref="console"/>--><appender-ref ref="debug"/><appender-ref ref="error"/><appender-ref ref="stdout"/><appender-ref ref="grpc"/></root>
</configuration>
3、代碼中添加日志
@RequestMapping("/fegin/test")public String feginTest() {iTestService.getServerPort();log.info("這是message1");return "message1";}
使用探針方式啟動
(1)使用idea啟動
配置VM options
javaagent配置的參數即skywalking-agent的絕對路徑。
-Dskywalking.agent.service_name="spring-cloud-service"
-Dskywalking.collector.backend_service="opaip:11800"
-javaagent:/Users/lison/work/workspace/project/skywalking-agent/skywalking-agent.jar
日志:
除此之外,鏈路追蹤的展示也非常強大,服務間的 API 調用關系與執行時間、調用狀態清晰列出,而且因為 SkyWalking 是方法層面上的擴展,會提供更加詳細的方法間的調用過程
提供不同維度的視圖
服務監控JVM