SkyWalking結合Logback獲取全局唯一標識 trace-id 記錄到日志中


為什么要獲取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,查看日志

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM