自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

項目中引進(jìn)這玩意,排查日志又快又準(zhǔn)!

開發(fā) 項目管理
TLog提供了一種最簡單的方式來解決日志追蹤問題,TLog會自動的對你的日志進(jìn)行打標(biāo)簽,幫你自動生成traceId貫穿你微服務(wù)的一整條鏈路,在排查日志的時候,可以根據(jù)traceId來快速定位請求處理的鏈路。

背景

隨著微服務(wù)盛行,很多公司都把系統(tǒng)按照業(yè)務(wù)邊界拆成了很多微服務(wù),在排錯查日志的時候,因為業(yè)務(wù)鏈路貫穿著很多微服務(wù)節(jié)點(diǎn),導(dǎo)致定位某個請求的日志以及上下游業(yè)務(wù)的日志會變得有些困難。

這時候可能有的小伙伴就會想到使用SkyWalking,Pinpoint等分布式追蹤系統(tǒng)來解決,并且這些系統(tǒng)通常都是無侵入性的,同時也會提供相對友好的管理界面來進(jìn)行鏈路Span的查詢,但是搭建分布式追蹤系統(tǒng)還是需要一定的成本的,所以本文要說的并不是這些分布式追蹤系統(tǒng),而是一款簡單、易用、幾乎零侵入、適合中小型公司使用的日志追蹤框架TLog。

TLog簡介

TLog提供了一種最簡單的方式來解決日志追蹤問題,TLog會自動的對你的日志進(jìn)行打標(biāo)簽,幫你自動生成traceId貫穿你微服務(wù)的一整條鏈路,在排查日志的時候,可以根據(jù)traceId來快速定位請求處理的鏈路。

TLog不收集日志,只在對你原來打印的日志上增強(qiáng),將請求鏈路信息traceId綁定到你打印的日志上。當(dāng)出現(xiàn)微服務(wù)中那么多節(jié)點(diǎn)的情況,官方推薦使用TLog+日志收集方案來解決。當(dāng)然分布式追蹤系統(tǒng)其實是鏈路追蹤一個最終的解決方案,如果項目中已經(jīng)上了分布式追蹤系統(tǒng),那TLog并不適用。

如下圖,是ELK配合TLog,快速定位請求處理的鏈路的示例。

圖片

TLog接入

1、接入步驟

1.1、引入依賴

<dependency>
<groupId>com.yomahub</groupId>
<artifactId>tlog-all-spring-boot-starter</artifactId>
<version>1.5.0</version>
</dependency>

1.2、替換logback配置項

圖片

到這其實就已經(jīng)完成了配置。

1.3、測試

圖片

這里是通過slf4j的LoggerFactory獲取Logger對象,因為logback適配了slf4j,最終會通過logback來輸出日志。

圖片

從這可以看出,11794076298070144 就是本次日志輸出的時候生成的一個請求的traceId,在排查日志的時候就可以通過這個traceId去搜索出整個請求的鏈路日志。

2、TLog接入方式

TLog總共提供了三種方式接入項目

  • Javaagent接入方式
  • 字節(jié)碼注入方式
  • 日志框架適配器方式

上面案例的接入方式其實是屬于日志框架適配器方式,并且是對于Logback框架的適配。TLog除了適配了Logback框架,還適配了Log4j框架和Log4j2框架,項目中可自行選擇。

Javaagent接入方式和字節(jié)碼注入方式相比與日志框架適配器方式對代碼的入侵性更小,但是這兩種方式僅僅只支持SpringBoot項目,并且相較于日志框架適配器的方式,MDC和異步日志功能并不支持,所以要想完整體驗TLog的功能,還是建議選擇日志框架適配器方式,日志框架適配器方式其實接入也很快,其實也就是修改一下配置文件的事。

圖片項目環(huán)境兼容對比圖片特性支持對比

TLog的基本原理

1、日志標(biāo)簽

前面在介紹TLog的時候,提到TLog會自動的對你的日志進(jìn)行打標(biāo)簽,這個標(biāo)簽就是日志標(biāo)簽,一個日志標(biāo)簽最多可以包含如下信息:

  • preApp:接口調(diào)用方服務(wù)名
  • preHost:接口調(diào)用方Host
  • preIp:接口調(diào)用方ip
  • currIp:當(dāng)前服務(wù)ip
  • traceId:鏈路id,調(diào)用方如果傳遞就是傳遞的值,不傳遞就會重新生成
  • spanId:鏈路spanId

默認(rèn)是按照如下labelPattern進(jìn)行數(shù)據(jù)拼接生成日志標(biāo)簽,所以默認(rèn)只打出spanId和traceId。

圖片

這也就是上面為什么示例中會輸出 <0><11794076298070144> 這種格式的原因,前面的0其實就是spanId。

如果你想改變?nèi)罩緲?biāo)簽輸出其它信息或者輸出的順序,只需要在SpringBoot配置文件中配置日志標(biāo)簽的生成樣式就行。

tlog.pattern=[$preApp][$preIp][$spanId][$traceId]

2、TLogContext

圖片

TLogContext是TLog是一個核心的組件,這個組件內(nèi)部是使用了TransmittableThreadLocal來傳遞traceId、preApp等信息。

當(dāng)有一個請求過來的時候,會從解析出traceId、preApp等信息,然后設(shè)置到TransmittableThreadLocal中,之后就可以在整個調(diào)用鏈路中從TLogContext中獲取到traceId等信息。

3、TLogRPCHandler

圖片

這個組件是用來處理調(diào)用方傳遞的traceId、preApp等信息,設(shè)置到TLogContext和MDC中,同時根據(jù)日志標(biāo)簽的格式生成日志標(biāo)簽。

第三方框架的適配

在實際項目中,一個請求處理過程可能會出現(xiàn)以下情況

  • 異步線程處理
  • 跨服務(wù)調(diào)用
  • MQ調(diào)用

那么對于這些情況來說,traceId應(yīng)該需要在異步線程、跨服務(wù)、MQ等中傳遞,以便更好地排查一個請求的處理鏈路。

而TLog對于以上可能出現(xiàn)的情況都做了大量的適配,保證traceId能夠在異步線程、微服務(wù)間、MQ等中能夠正確傳遞。

1、異步線程

1.1 一般異步線程

所謂的一般異步線程就是指直接通過new Thread的方法來創(chuàng)建異步線程,然后來執(zhí)行,這種方式TLog是天然支持?jǐn)y帶traceId的,如圖。

圖片

執(zhí)行結(jié)果

圖片

從這可以看出這種異步方式的確成功傳遞了traceId。

1.2 線程池

對于線程池來說,其實默認(rèn)也是支持傳遞traceId,但是由于線程池中的線程是可以復(fù)用了,為了保證線程間的數(shù)據(jù)互不干擾,需要使用TLogInheritableTask將提交的任務(wù)進(jìn)行包裝。

ThreadPoolExecutor pool =
new ThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
pool.execute(new TLogInheritableTask() {
@Override
public void runTask(){
logger.info("異步執(zhí)行");
}
});

上述代碼的寫法會有點(diǎn)耦合,每次提交任務(wù)都需要創(chuàng)建一個TLogInheritableTask,比較麻煩,可以按如下寫法進(jìn)行簡化。

圖片

TLogThreadPoolExecutor

自己寫個TLogThreadPoolExecutor繼承ThreadPoolExecutor,重寫execute方法(submit最終也會調(diào)用execute方法執(zhí)行),然后將提交的任務(wù)統(tǒng)一包裝成TLogInheritableTask,這樣需要使用線程池的地方直接創(chuàng)建TLogThreadPoolExecutor就可以了,就不需要在提交任務(wù)的時候創(chuàng)建TLogInheritableTask了。

ThreadPoolExecutor pool =
new TLogThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
pool.execute(() -> logger.info("異步執(zhí)行"));

2、對RPC框架的支持

除了對異步線程的支持,TLog也支持常見的Dubbo,Dubbox,OpenFeign三大RPC框架,在SpringBoot項目中不需要任何配置,只需要引入依賴就可以實現(xiàn)traceId在服務(wù)之間的傳遞

2.1 對Dubbo和Dubbox的支持

對于Dubbo和Dubbox的支持是基于Dubbo的Filter擴(kuò)展點(diǎn)來的

圖片

TLog通過SPI機(jī)制擴(kuò)展Filter,在消費(fèi)者發(fā)送請求前從TLogContext獲取到traceId,然后將traceId和其它調(diào)用者數(shù)據(jù)設(shè)置請求數(shù)據(jù)中,服務(wù)提供者在處理請求的時候,也會經(jīng)過Filter,從請求中獲取到traceId等信息,然后設(shè)置到TLogContext中,從而實現(xiàn)了traceId在dubbo的消費(fèi)者和提供者之間的傳遞。

2.2 對OpenFeign的支持

對于OpenFeign的支持其實也是通過Feign提供的擴(kuò)展點(diǎn)RequestInterceptor來實現(xiàn)的

圖片

發(fā)送請求之前,從TLogContext獲取到traceId,將traceId等信息添加到請求頭中,然后就可以通過Http請求將traceId等信息傳遞。

當(dāng)被調(diào)用方接收到請求之后,會經(jīng)過TLogWebInterceptor這個攔截器進(jìn)行攔截,從請求頭中獲取到這些參數(shù),設(shè)置到TLogContext中。

圖片

3、對常用Http框架的支持

除了一些RPC框架,TLog也對一些Http框架進(jìn)行了適配,比如

  • HttpClient
  • Okhttp
  • hutool-http
  • RestTemplate
  • forest

使用這些Http框架也可以實現(xiàn)traceId的傳遞

其實這些框架的適配跟Feign的適配都是大同小異,都是基于這些Http框架各自提供的擴(kuò)展點(diǎn)進(jìn)行適配的,將traceId等信息放到請求頭中,這里都不舉例了,具體的使用方法可以在官網(wǎng)查看。

4、對SpringCloud Gateway的支持

同樣的,TLog也適配了SpringCloud Gateway

圖片

原理也是一樣的,就是適配了Gateway的GlobalFilter,從請求頭中獲取traceId等信息。

除了適配了Gateway網(wǎng)關(guān),TLog也適配了Soul網(wǎng)關(guān)。

5、對MQ的支持

對于MQ的支持跟異步線程差不多,需要將你發(fā)送的消息包裝成TLogMqWrapBean對象

圖片

TLogMqWrapBean

發(fā)送的時候直接發(fā)送TLogMqWrapBean對象過去

TLogMqWrapBean<BizBean> tLogMqWrap = new TLogMqWrapBean(bizBean);
mqClient.send(tLogMqWrap);

TLogMqWrapBean會將traceId等信息攜帶,消費(fèi)者接受到TLogMqWrapBean,然后通過TLogMqConsumerProcessor處理業(yè)務(wù)消息。

TLogMqConsumerProcessor.process(tLogMqWrapBean, new TLogMqRunner<BizBean>() {
@Override
public void mqConsume(BizBean o){
//業(yè)務(wù)操作
}
});

如此就實現(xiàn)了traceId通過MQ傳遞。

在實際使用中,根據(jù)不同的MQ的類型,可以將消息包裝成TLogMqWrapBean對象的過程和處理消息的過程做統(tǒng)一的封裝處理,以減少發(fā)送消息和處理消息對于TLog的耦合。

6、對任務(wù)框架的支持

TLog主要是支持一下四種任務(wù)框架

  • JDK Timer
  • Quartz框架
  • spring-scheduled
  • XXL-JOB框架

其中,spring-scheduled和XXL-JOB在SpringBoot環(huán)境底下是無需任務(wù)配置的,只需要引入依賴即可。

Timer在使用的時候需要將任務(wù)包裝成TLogTimerTask,Quartz需要把QuartzJobBean替換成TLogQuartzJobBean就可以了。

小總結(jié)

其實從上面的各種適配可以看出,其實本質(zhì)都是一樣的,就是根據(jù)具體框架的擴(kuò)展點(diǎn),在發(fā)送請求之前從TLogContext獲取到traceId,將traceId等調(diào)用者的信息在請求中攜帶,然后被調(diào)用方解析請求,取出traceId和調(diào)用者信息,設(shè)置到被調(diào)用方服務(wù)中的TLogContext中。

所以,如果一旦需要遇到官方還未適配的框架或者組件,可以參照上述適配過程進(jìn)行適配即可。

最后

總的來說,TLog是一款非常優(yōu)秀的日志追蹤的框架,很適合中小公司使用。這里來總結(jié)一下TLog的特性

  • 通過對日志打標(biāo)簽完成輕量級微服務(wù)日志追蹤
  • 提供三種接入方式:javaagent完全無侵入接入,字節(jié)碼一行代碼接入,基于配置文件的接入
  • 對業(yè)務(wù)代碼無侵入式設(shè)計,使用簡單,10分鐘即可接入
  • 支持常見的log4j,log4j2,logback三大日志框架,并提供自動檢測,完成適配
  • 支持dubbo,dubbox,feign三大RPC框架
  • 支持Spring Cloud Gateway和Soul網(wǎng)關(guān)
  • 支持HttpClient和Okhttp等http調(diào)用框架標(biāo)簽傳遞
  • 支持多種任務(wù)框架,JDK的TimerTask,Quartz,XXL-JOB,spring-scheduled
  • 支持日志標(biāo)簽的自定義模板的配置,提供多個系統(tǒng)級埋點(diǎn)標(biāo)簽的選擇
  • 支持異步線程的追蹤,包括線程池,多級異步線程等場景
  • 幾乎無性能損耗,快速穩(wěn)定,經(jīng)過壓測,損耗在0.01%

由于本文篇幅有限,無法全面對TLog進(jìn)行講解,如果想深入了解該框架,可自行閱讀官網(wǎng)或者源碼。

責(zé)任編輯:武曉燕 來源: 三友的java日記
相關(guān)推薦

2016-11-28 14:11:32

搜索

2021-04-26 08:16:18

CPU 語言編寫

2021-03-11 12:27:36

java 變量數(shù)量

2021-06-02 08:00:57

WebAsyncTas項目異步

2021-01-14 09:04:24

線程池工具類面試

2022-06-24 11:14:00

美團(tuán)開源

2023-04-24 16:25:47

3D開發(fā)

2022-03-14 17:56:15

云廠商系統(tǒng)阿里云

2022-05-10 09:16:50

MQ內(nèi)存消費(fèi)者

2022-10-09 09:38:10

高可用設(shè)計

2021-05-17 18:27:20

Token驗證HTTP

2024-05-29 08:56:31

2021-07-14 18:21:50

負(fù)載均衡TCP網(wǎng)關(guān)

2021-02-04 11:01:59

計算機(jī)信號轉(zhuǎn)換

2021-03-04 13:14:54

文件系統(tǒng)存儲

2022-02-07 09:40:10

高可用高并發(fā)高性能

2023-05-15 10:03:00

Redis緩存穿透

2020-09-08 18:01:58

預(yù)算削減成本首席信息安全官

2025-04-18 08:50:57

項目裝飾器日志

2020-03-06 16:50:08

Java錯誤日志
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號