應用SpringAOP及Tlog工具完成日誌鏈路追蹤、收集、持久化

劉墨澤發表於2021-11-22

❌一、痛點

目前我司各系統的日誌管理比較原始,使用logback打日誌到log檔案,雖然有服務管理平臺,但記錄的日誌也僅僅是前置機呼叫後臺系統的出入參,當遇到問題時查日誌較為麻煩。

登入VPN-開啟伺服器-找到日誌目錄-開啟日誌檔案-搜尋

而這個過程也僅僅是在一臺伺服器上的操作,一般需要看前置機、後臺系統甚至服務管理平臺。

當使用者較少時,通過先後順序等其他標誌還能查到,但當呼叫量稍多後就很難判斷哪個日誌是哪個操作發出的。

另外,我司產品前臺面向使用者,後臺與多家公司產品有大量互相呼叫,當使用者遇到問題首先投訴的是我司產品,如在日誌中找不到問題點,背鍋的就是我們。

✔️二、解決思路

任務有2個

  1. 鏈路追蹤,一次呼叫的日誌,無論跨多少平臺都能串起來;
  2. 日誌存庫,這主要是為了開發一個日誌查詢功能,提供給運維人員。

2.1、Tlog

經過一番考察吧,對於鏈路追蹤,我們選用了Tlog這個日誌追蹤工具。主頁連結:yomahub.com/tlog/

主要考慮點是:

  • 最基礎的功能:日誌打標籤,並且支援標籤模板的自定義,可通過TLogContext.getTraceId()和TLogContext.putTraceId(id)獲取和設定id;
  • 業務程式碼無侵入

不過對HttpClient是侵入式的,需要加攔截器

這個攔截器的實現還是頗為簡單

public class TLogHttpClientInterceptor implements HttpRequestInterceptor {
    
    private static final Logger log = LoggerFactory.getLogger(TLogHttpClientInterceptor.class);
    
    @Override
    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
        Args.notNull(request, "HTTP request");
        String traceId = TLogContext.getTraceId();
        if(StringUtils.isNotBlank(traceId)) {
            String appName = TLogSpringAware.getProperty("spring.application.name");

            request.addHeader(TLogConstants.TLOG_TRACE_KEY, traceId);
            request.addHeader(TLogConstants.TLOG_SPANID_KEY, SpanIdGenerator.generateNextSpanId());
            request.addHeader(TLogConstants.PRE_IVK_APP_KEY, appName);
            request.addHeader(TLogConstants.PRE_IVK_APP_HOST, LocalhostUtil.getHostName());
            request.addHeader(TLogConstants.PRE_IP_KEY, LocalhostUtil.getHostIp());
        } else {
            log.debug("[TLOG]鏈湴threadLocal鍙橀噺娌℃湁姝g‘浼犻�抰raceId,鏈璋冪敤涓嶄紶閫抰raceId");
        }
    }
}

 

不過需要注意的點是,有一些方法使用了Hutool高版本提供的方法,注意專案中版本衝突的解決。

對Tlog的整合還有一個問題,公司使用的服務管理平臺由其他部門開發管理,需要該部門協同解決,不過好在我們可以拿到原始碼??

2.2、日誌儲存

日誌儲存自然不希望對當前業務有任何影響,考慮到系統併發量並不是很大,就採用執行緒池來呼叫日誌系統存庫。

2.3、日誌收集

使用註解主要對出入參及異常信心進行收集處理。另外對logback進行簡單封裝,提供info()、error()等方法,這些方法輸入的日誌也進行收集、儲存。 因業務特殊性,需要使用的系統都複用一套自定義註解、公共切面方法,並在切面中完成特殊業務的處理。

頗多細節就不多寫了,本文主要就是介紹整體思路,對於呼叫量說多不多的系統還可以。

 

相關文章