為什么要獲取trace-id
通過上文Docker-Compose搭建單體SkyWalking我們搭建了SkyWalking服務,我們需要在日志中記錄下來每次請求的唯一標識(trace-id),這樣就可以在SkyWalking定位到有問題的trace-id,然后通過這個trace-id我們就可以通過日志系統去定位到相關的日志,從而發現並解決問題。
最開始和我說想法的老哥,想自己實現一套trace-id,以便滿足於如果想替換追蹤工具,不用改太多代碼。想法是很好的,但是經過查詢SkyWalking的GIT issue ,發現SW並沒有提供這種自定義trace-id的功能,
決定獲取SW生成的全局trace-id,這里主要是記錄下實現方式,這里使用了開源組件完成的效果
配置過程
在pom中添加依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>6.2.0</version>
</dependency>
這是一個skywalking的工具,通過這個工具可以得到trace-id
修改logback.xml中的Appender的Pattern
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern>
</layout>
</encoder>
這里需要注意的是
- Logback中的encoder本身是包含一個layout的,在有此Appender中是可以直接用encoder中的layout部分的,鑒於本人使用的是Kafka-appender這個插件,盡量通用就寫成這樣了。
- encoder的class是LayoutWrappingEncoder,不是PatternLayoutEncoder!
- 使用%tid 來占trace-id的位置,默認TID:N/A,當有請求調用時,會顯示trace-id
- 這種方式支持探針與注解
測試
使用探針參數添加到LogDemo中測試,Demo地址: https://github.com/hellxz/LogDemo/tree/get-skywalking-trace-id ,注意分支
Java只需要在VM options中追加格式為
-javaagent:/path/to/path/skywalking-agent.jar
-Dskywalking.agent.service_name=YOUR_APP_NAME
-Dskywalking.collector.backend_service=OAP_SEVER_HOST:gRPC_PORT
舉例如下:
-javaagent:D:/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=logDemo
-Dskywalking.collector.backend_service=10.2.7.70:11800
啟動項目,如果沒有kafka輸出,可以注釋掉,只留下console輸出
我們可以看到默認的啟動打出的日志是這樣的
訪問測試接口http://localhost:8000/test/aaa,查看日志
引用文章 https://daocloud-labs.github.io/DMP-Public-Docs/skywalking/integration-log4j.html
感覺不美觀可以自行修改,本文內容以上。