真香!被阿里老兄安利了一個輕量級的日志追蹤框架。10 分鐘即可接入!
開始文章之前,且聽我簡單BB幾句。
國產(chǎn)開源之路不易,好的國產(chǎn)開源項(xiàng)目還是太少太少了。國內(nèi)一些用心做開源的技術(shù)人基本都是靠愛發(fā)電。
今天介紹的這個日志框架的作者自己維護(hù)了 3 個開源框架,為此他經(jīng)常忙到凌晨1,2點(diǎn)。目前,這個日志框架目前仍在開發(fā)中。不得不說的是!這個項(xiàng)目整體的代碼質(zhì)量很高,非常值得小伙伴們學(xué)習(xí)一波!
前言
隨著微服務(wù)盛行,很多公司都把系統(tǒng)按照業(yè)務(wù)邊界拆成了很多微服務(wù),在排錯查日志的時候。因?yàn)闃I(yè)務(wù)鏈路貫穿著很多不同微服務(wù),同一個微服務(wù)又可能部署著十幾個節(jié)點(diǎn),要排查某一個請求的日志,總不見得一個個節(jié)點(diǎn)搜過去吧,所以這時候日志的鏈路追蹤就顯得很有必要了。
很多公司可能自己搭了 ELK 或者使用了一些云產(chǎn)品的日志服務(wù),但是它們只解決了日志的收集和展現(xiàn),并沒有提供日志的鏈路追蹤。
也有公司上 SkyWalking,Pinpoint 等分布式追蹤系統(tǒng)來解決,基于 OpenTracing 規(guī)范,而且通常都是無侵入性的,提供探針來收集發(fā)送日志,并且有相對友好的展示界面來進(jìn)行鏈路的查詢。
分布式追蹤系統(tǒng)固然是一個比較完善的解決方案,但是熟悉以及推廣到全公司的系統(tǒng)需要一定的時間周期,而且當(dāng)中涉及到鏈路 span 節(jié)點(diǎn)的存儲成本問題,全量采集還是部分采集?如果全量采集,就以 SkyWalking 的存儲來舉例,ES 集群搭建至少需要 5 個節(jié)點(diǎn)。這就需要增加服務(wù)器成本。況且如果微服務(wù)節(jié)點(diǎn)多的話,一天下來產(chǎn)生幾十 G 上百 G 的數(shù)據(jù)其實(shí)非常正常。如果想保存時間長點(diǎn)的話,也需要增加服務(wù)器磁盤的成本。
有沒有一種快速低成本來解決日志追蹤問題方案呢?
我發(fā)現(xiàn)了最近在 Gitee 上比較火的開源項(xiàng)目 TLog,這是一款主打輕量級的日志追蹤框架,號稱 10 分鐘就可以接入你的系統(tǒng),支持主流的 dubbo,dubbox,openfeign 等 rpc 框架,自動適配 logback,log4j,log4j2 等日志框架。目前該項(xiàng)目入選了Gitee 2020 年的 GVP。
項(xiàng)目地址為:https://gitee.com/bryan31/TLog

特點(diǎn)
TLog 提供了一種最簡單的方式來解決日志追蹤問題,它不收集日志,也不需要額外的存儲空間,它只是自動的對你的日志進(jìn)行打標(biāo)簽,生成一系列的追蹤信息的標(biāo)簽融入到你的日志里。這些標(biāo)簽?zāi)軌蛴行У墨@知一條日志屬于哪一個調(diào)用鏈,在某個調(diào)用鏈里屬于哪一個層次,以及服務(wù)的上游信息。
TLog 的官網(wǎng)羅列了以下特性:
通過對日志打標(biāo)簽完成輕量級微服務(wù)日志追蹤 提供三種接入方式:javaagent 完全無侵入接入;2.字節(jié)碼一行代碼接入;3.基于配置文件的接入 對業(yè)務(wù)代碼無侵入式設(shè)計(jì),使用簡單,10 分鐘即可接入 支持常見的 log4j,log4j2,logback 三大日志框架,并提供自動檢測,完成適配 支持 dubbo,dubbox,springcloud 三大 RPC 框架 支持日志標(biāo)簽的自定義模板的配置,提供多個系統(tǒng)級埋點(diǎn)標(biāo)簽的選擇 支持異步線程的追蹤,包括線程池,多級異步線程等場景 幾乎無性能損耗,快速穩(wěn)定
接入
TLog 主打輕量級和易用性,在接入層面,TLog 提供了探針模式,字節(jié)碼模式和適配模式。官網(wǎng)提供了一張表供你選擇最適合的接入方式:

探針模式(javaagent)
其實(shí)探針模式是完全不侵入系統(tǒng)的,可以探測你使用的 rpc 框架和日志框架進(jìn)行自動適配
只需要在 jvm 啟動參數(shù)上加入:-javaagent:/your_path/tlog-agent.jar 就可以了
字節(jié)碼注入方式
侵入 pom 文件和啟動類,也可以自動探測你使用的 rpc 框架和日志框架
加入依賴:
<dependency>
??<groupId>com.yomahubgroupId>
??<artifactId>tlog-all-spring-boot-starterartifactId>
??<version>1.1.5version>
dependency>
然后啟動類中加入字節(jié)碼增強(qiáng)的一句代碼:

日志框架適配方式
侵入你所使用的日志框架配置文件,可以自動探測你所使用的 RPC 框架
每種日志框架有不同的配置方式,官網(wǎng)文檔寫的很詳細(xì),這里就不展開說明了。
日志標(biāo)簽
TLog 的核心就是標(biāo)簽,通過對普通的日志追加標(biāo)簽來獲得服務(wù)追蹤信息。
TLog 的標(biāo)簽分內(nèi)置標(biāo)簽和自定義標(biāo)簽兩種,下面就來說說這 2 種標(biāo)簽的定義。
內(nèi)置標(biāo)簽
TLog 內(nèi)置有 4 個標(biāo)簽可供選擇:preApp,preIp,spanId,traceId
preApp 和 preIp 是上游服務(wù)的名稱和 IP,其中 traceId 最為關(guān)鍵,這就是貫穿整條鏈路的追蹤號,可以用來追溯某個業(yè)務(wù)請求。
spanId 是能展示這條日志在調(diào)用鏈中的層次關(guān)系。我們假設(shè)一次分布式調(diào)用中產(chǎn)生的 TraceId 是 0a1234(實(shí)際不會這么短),那么根據(jù)上文 SpanId 的產(chǎn)生過程,有下圖:

顯而易見,如果把一次調(diào)用中的 spanId 全部收集起來,是可以很容易組成一棵調(diào)用樹的。
TLog 默認(rèn)只展示spanId和traceId兩個內(nèi)置標(biāo)簽,但是你可以在 springboot 的配置文件中加入
tlog.pattern=[$preApp][$preIp][$spanId][$traceId]
就可以獲得如下的日志展示效果:
2020-11-08?01:34:41.421?[DubboServerHandler-thread-2]?INFO??c.y.t.example.dubbo.service.impl.DemoServiceImpl?-?[demo-app][192.168.50.80][0.1][7457635127294656]?logback-dubbox-provider:invoke?method?sayHello,name=jack
2020-11-08?01:34:41.422?[Thread-8]?INFO??c.y.tlog.example.dubbo.service.impl.AsynDomain?-?[demo-app][192.168.50.80][0.1][7457635127294656]?這是異步方法哦
2020-11-08?01:34:41.423?[Thread-8]?INFO??c.y.tlog.example.dubbo.service.impl.AsynDomain?-?[demo-app][192.168.50.80][0.1][7457635127294656]?異步方法開始
2020-11-08?01:34:41.423?[Thread-8]?INFO??c.y.tlog.example.dubbo.service.impl.AsynDomain?-?[demo-app][192.168.50.80][0.1][7457635127294656]?異步方法結(jié)束
自定義標(biāo)簽
TLog 允許用戶對某一個方法內(nèi)的日志加入特定的自定義標(biāo)簽。
平時做項(xiàng)目中有的童鞋喜歡在每條日志上打個訂單號,以便方便搜索,類似這樣的操作以后就可以輕松的用這個特性來解決啦!

當(dāng)然對于@TLogAspect標(biāo)簽而言,支持的特性有很多,不僅支持基本類型,也支持對象類型的屬性取值,同時支持模板設(shè)定,自定義轉(zhuǎn)換器等等。詳細(xì)用法請看官方文檔。
其他細(xì)節(jié)
TLog 在其他細(xì)節(jié)部分也作了一些支持。
所有的標(biāo)簽顯示模板和顯示在日志條目中的位置,都是可以自由配置的。
對異步子線程以及線程池中的場景,標(biāo)簽的信息依舊不會丟失。
以上的案例都是針對于 springboot 的,TLog 同時提供了 springboot 和非 springboot 兩種版本,以方便更多不同種類的項(xiàng)目的接入。
具體支持部分也請移步 TLog 的官方文檔。
最佳實(shí)踐
TLog 的亮點(diǎn)就是輕量,接入快,適配流行的 rpc 和日志框架也比較全。但是看下來,因?yàn)椴蛔魅罩臼占皇羌尤胱粉櫺畔?。雖然從信息角度來說可追蹤了。但是實(shí)際追蹤起來還是不方便。
個人認(rèn)為 ELK+TLog 或者 云日志產(chǎn)品+TLog 是一個不錯的選擇。ELK 或者云日志產(chǎn)品負(fù)責(zé)收集,TLog 負(fù)責(zé)加入追蹤信息,這樣就可以互相彌補(bǔ)。成為一套完整的追蹤體系。
同時 TLog 作者也表示,未來的的藍(lán)圖是做成日志領(lǐng)域集收集,追蹤,統(tǒng)計(jì),分析,展現(xiàn)于一體日志中間件。現(xiàn)在目前還在不停迭代中。
最后的思考
在日志追蹤領(lǐng)域,TLog 這個開源作品給我們展示了一種簡約但又有效的方案,雖然它目前還不提供收集統(tǒng)計(jì)和 UI 展現(xiàn),但是在易用性方面確實(shí)下了一番功夫。希望隨著這個項(xiàng)目慢慢的迭代,能給開源社區(qū)帶來更加豐富的特性。
最終再次附上 TLog 的項(xiàng)目托管地址,官網(wǎng)也在里面有連接
https://gitee.com/bryan31/TLog
最近寫的一些干貨,每篇都很用心,歡迎各位小伙伴閱讀/點(diǎn)贊/分享:
我是Guide哥,Java后端開發(fā),會一點(diǎn)前端知識,喜歡烹飪,自由的少年。一個三觀比主角還正的技術(shù)人。我們下期再見!
