❌一、痛點
目前我司各系統的日志管理比較原始,使用logback打日志到log文件,雖然有服務管理平台,但記錄的日志也僅僅是前置機調用后台系統的出入參,當遇到問題時查日志較為麻煩。
登錄VPN-打開服務器-找到日志目錄-打開日志文件-搜索
而這個過程也僅僅是在一台服務器上的操作,一般需要看前置機、后台系統甚至服務管理平台。
當用戶較少時,通過先后順序等其他標志還能查到,但當調用量稍多后就很難判斷哪個日志是哪個操作發出的。
另外,我司產品前台面向用戶,后台與多家公司產品有大量互相調用,當用戶遇到問題首先投訴的是我司產品,如在日志中找不到問題點,背鍋的就是我們。
✔️二、解決思路
任務有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()等方法,這些方法輸入的日志也進行收集、存儲。 因業務特殊性,需要使用的系統都復用一套自定義注解、公共切面方法,並在切面中完成特殊業務的處理。
頗多細節就不多寫了,本文主要就是介紹整體思路,對於調用量說多不多的系統還可以。