如何在日誌中批量添加業務ID

如何在日誌中批量添加業務ID

一種日誌記錄思路

很多系統的日誌格式比較亂,沒有一個統一的樣式,而在系統已經成型的情況下,很難再大規模的去批量調整日誌格式,所以設計了一個日誌Util工具,在日誌打印時嵌入指定的業務參數。

閒話少說,乾貨先上:

LogUtil.java

 package com.alan.log.utils;
import com.google.cmmon.base.Joiner;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
/**
* Created by alan on 2018/11/16.
* 日誌工具
*/
public class LogUtil {
private static final String BIZPARAM = "bizParam";
/**
* 設置日誌中的業務參數
*
* @param bizId 業務ID
*/
public static void setBizId(String... bizId) {
String bizParam = MDC.get(BIZPARAM);
if (StringUtils.isBlank(bizParam)) {
bizParam = Joiner.on(",").skipNulls().join(bizId);
MDC.put(BIZPARAM, bizParam);
} else {
StringBuilder sbd = new StringBuilder()
.append(bizParam)
.append(",")
.append(Joiner.on(",").skipNulls().join(bizId));

MDC.put(BIZPARAM, sbd.toString());
}
}
/**

* 日誌打點,加入清除原有數據的代碼
*
* @param bizId 業務ID
*/
public static void setBizIdWithClear(String... bizId) {
MDC.clear();
setBizId(bizId);
}
}

可以看到,logUtil使用了slf4j中的MDC來暫存bizId信息,關於MDC的說明,可以參考這裡:logback.qos.ch/manual/mdc.…

至於提供的setBizIdWithClear方法,主要防止在線程池場景下線程複用時BizId串掉的問題出現。

如何調用

目前採用的調用方式比較原始,在dubbo\\rest Service方法、NSQ消息消費處理類入口中直接調用,如下:

 LogUtil.setBizIdWithClear(refundRequest.getAcquireNo(),refundRequest.getRequestId());

其中bizId可以根據自己系統中的不同考慮,傳入不同的值,也可以傳遞多個。 當然,如果希望做的代碼入侵性更小一些,可以考慮使用intercepter,或者針對web工程使用filter,或者直接使用切面來做。不過由於不同入口的bizId不盡相同,所以在這裡就簡單的做個調用。大家可以根據自己系統的情況選擇不同的方式。

如何生效

既然記錄在了MDC中,在寫日誌文化時如何記錄下來呢?這塊就需要配置對應的logback.xml或者log4j.xml了,如下:

 <appender>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{bizParam}] %-5level %logger{56} - %msg%n
/<pattern>
/<encoder>
/<appender>

這是一個普通的appender配置,關鍵就是在pattern格式表達式中的[%X{bizParam}],bizParam需要與LogUtil中的BIZPARAM對應起來

最終的日誌格式

2016-11-18 16:13:39.022 [Thread-5] [161118105657385565] INFO com.alan....

可以看到,對應的bizId已經按照對應的格式在日誌中的固定位置打印出來了,後續做日誌採集也好、日誌搜索也好,都是會比較容易的。

PS:後續的日誌採集、存儲、搜索等功能,可以使用ES+LogStash+logView等開源框架,問題定位不要太爽。

"


分享到:


相關文章: