Java記錄日誌附帶請求標識
阿新 • • 發佈:2019-03-20
起因
系統是web介面服務,排查故障的時候經常需要記錄某次請求呼叫鏈路日誌。這樣我們拉日誌的時候只要匹配這個traceid就行了
第一版解決方案
原來我們一直用了個很low的辦法,在請求開始的時候生成traceid儲存在ThreadLocal中,每次記錄日誌顯示的打印出來,類似下面這樣。
logger.info("_traceId:{}===UserConfigController.get===isSuccess:{}", HttpContext.getTraceId(), JsonUtils.toJson(callResult));
缺點顯而易見,每次列印log,都需要帶上traceid,非常非常麻煩,程式碼也不夠簡潔。突然發現有了 org.slf4j.MDC 這個類,那麼就有了下面的解決方案。
優化解決方案
org.slf4j.MDC 類中使用 ThreadLocalMap 儲存當前執行緒的一些資訊,可以在記錄日誌中使用,那麼呼叫方式很簡單,增加如下java程式碼
MDC.put("sysTraceId", trace);
在日誌配置中加入該節點
<property name="PATTERN" value="%d [%t-${PID}] %-5p %c - [%X{sysTraceId}] [%m]%n" />
那麼最終效果如下:
2019-03-20 11:40:27,341 [pool-2-thread-1-7989] INFO com.dadaabc.callcenter.service.impl.RetryMqRecordServiceImpl - [10.2.25.77_09abd5234cc54a4ab64826b618d0388a] [_trace_id:10.2.25.77_09abd5234cc54a4ab64826b618d0388a當前處理重試mq條數,totalcount:0] 2019-03-20 11:40:27,342 [pool-2-thread-1-7989] INFO com.dadaabc.callcenter.web.worker.RetryMqRecordWorker - [10.2.25.77_09abd5234cc54a4ab64826b618d0388a] [_trace_id:10.2.25.77_09abd5234cc54a4ab64826b618d0388a>>>[RetryMqRecordWorker]>>> end ,used:63ms]
有了MDC,我們可以很方便的加入一些全域性日誌,真是很好的一個工具,程式碼