自定義ApiBoot Logging鏈路以及單元ID生成策略

ApiBoot Logging會爲每個請求都對應建立鏈路編號(TraceID)以及單元編號(SpanID),用於歸類每一次請求日誌,經過一個鏈路下日誌單元的Parent SpanID能夠進行上下級關係的梳理。html

前文回顧

瞭解鏈路編號的傳遞方式

在每一次請求中鏈路編號(traceId)、單元編號(spanId)都是經過HttpHeader的方式進行傳遞,日誌的起始位置會主動生成traceIdspanId,而起始位置的Parent SpanId則是不存在的,值爲nullgithub

這樣每次經過restTemplateOpenfeign的形式訪問其餘服務的接口時,就會攜帶起始位置生成的traceIdspanId到下一個服務單元json

默認編號

ApiBoot Logging內部提供了默認的編號格式,默認爲通用格式,沒有區分性,沒法從編號上進行區分日誌的具體歸類。api

默認的鏈路編號

ApiBoot Logging內部經過集成minbox-logging日誌組件來完成日誌的採集等基本功能,每一次生成採集的日誌時都會經過LoggingTraceGenerator接口進行生成鏈路編號(TraceID),該接口源碼以下所示:架構

/** * ApiBoot Logging Tracer * Create new traceId * * @author:恆宇少年 - 於起宇 * <p> * DateTime:2019-07-10 17:01 * Blog:http://blog.yuqiyu.com * WebSite:http://www.jianshu.com/u/092df3f77bca * Gitee:https://gitee.com/hengboy * GitHub:https://github.com/hengboy */
public interface LoggingTraceGenerator {
    /** * create new traceId * * @return traceId * @throws MinBoxLoggingException exception */
    String createTraceId() throws MinBoxLoggingException;

}
複製代碼

ApiBoot Logging默認的鏈路編號(TraceID)採用的是UUID隨機字符串的方式生成的,內部實現是經過LoggingTraceGenerator接口的默認實現類LoggingDefaultTraceGenerator進行生成,生成類源碼以下所示:框架

/** * ApiBoot Logging Tracer Default Support Instance * * @author:恆宇少年 - 於起宇 * <p> * DateTime:2019-07-10 17:28 * Blog:http://blog.yuqiyu.com * WebSite:http://www.jianshu.com/u/092df3f77bca * Gitee:https://gitee.com/hengboy * GitHub:https://github.com/hengboy */
public class LoggingDefaultTraceGenerator implements LoggingTraceGenerator {
    /** * Use UUID as the default traceId * * @return traceId * @throws MinBoxLoggingException Exception */
    @Override
    public String createTraceId() throws MinBoxLoggingException {
        return UUID.randomUUID().toString();
    }
}

複製代碼

默認的單元編號

單元編號是一條鏈路下通過的每個業務單元的惟一標識,在SpringCloud微服務的場景下每發起一個請求內部經過Openfeign可能會通過多個服務,這樣每通過的一個服務稱之爲單元,而當前這條鏈路下的單元惟一標識字符串就稱爲單元編號dom

minbox-logging提供了生成單元編號的接口LoggingSpanGenerator,源碼以下所示:curl

/** * ApiBoot Logging Span * Create new spanId * * @author:恆宇少年 - 於起宇 * <p> * DateTime:2019-07-10 17:02 * Blog:http://blog.yuqiyu.com * WebSite:http://www.jianshu.com/u/092df3f77bca * Gitee:https://gitee.com/hengboy * GitHub:https://github.com/hengboy */
public interface LoggingSpanGenerator {
    /** * create new spanId * * @return span id * @throws MinBoxLoggingException exception */
    String createSpanId() throws MinBoxLoggingException;
}
複製代碼

spanId默認採用的跟traceId生成方式一致,都是UUID隨機字符串,minbox-logging提供了LoggingSpanGenerator接口默認的實現LoggingDefaultSpanGenerator,源碼以下所示:

/** * ApiBoot Logging Default Span * Use By Create New SpanId * * @author:恆宇少年 - 於起宇 * <p> * DateTime:2019-07-15 17:24 * Blog:http://blog.yuqiyu.com * WebSite:http://www.jianshu.com/u/092df3f77bca * Gitee:https://gitee.com/hengboy * GitHub:https://github.com/hengboy */
public class LoggingDefaultSpanGenerator implements LoggingSpanGenerator {
    /** * Create New SpanId * * @return SpanId * @throws MinBoxLoggingException Exception */
    @Override
    public String createSpanId() throws MinBoxLoggingException {
        return UUID.randomUUID().toString();
    }
}
複製代碼

自定義編號

咱們能夠根據本身的業務進行自定義traceIdspanId,能夠加入一些本身業務的元素,只須要提供minbox-logging提供的生成traceId的接口LoggingTraceGenerator、生成spanId的接口LoggingSpanGenerator對應的實現類,並將實現類交給LoggingFaceBean管理便可。

自定義鏈路編號

/** * 自定義traceId生成策略 * * @author 恆宇少年 */
public class CustomTraceIdGenerator implements LoggingTraceGenerator {
    /** * 鏈路編號前綴 */
    private static final String TRACE_ID_PREFIX = "local";
    
    @Override
    public String createTraceId() throws MinBoxLoggingException {
        return TRACE_ID_PREFIX + UUID.randomUUID().toString().hashCode();
    }
}
複製代碼

咱們建立名爲CustomTraceIdGenerator的類並實現LoggingTraceGenerator接口,實現createTraceId()方法的返回值根據local-做爲前綴,拼接UUID隨機字符串的hashCode值做爲後綴。

自定義單元編號

/** * 自定義單元編號生成策略 * * @author 恆宇少年 */
public class CustomSpanIdGenerator implements LoggingSpanGenerator {
    /** * 單元編號前綴 */
    private static final String SPAN_ID_PREFIX = "group";

    @Override
    public String createSpanId() throws MinBoxLoggingException {
        return SPAN_ID_PREFIX + UUID.randomUUID().toString().hashCode();
    }
}
複製代碼

咱們建立名爲CustomSpanIdGenerator的類並實現LoggingSpanGenerator接口,在createSpanId()方法的返回值根據group-做爲前綴,使用UUID隨機字符串的hashCode值做爲後綴。

在上面咱們已經建立了自定義traceId以及spanId的實現類,咱們須要將實現類的實例交給LoggingFactoryBean管理,這樣咱們才能夠實現自定義編號。

LoggingFactoryBeanCustomizer

ApiBoot Logging提供了一個自定義設置LoggingFactoryBean的接口LoggingFactoryBeanCustomizer,經過該接口能夠修改LoggingFactoryBean內容許修改的任意值。

咱們建立名爲CustomCreateTraceAndSpanId類並實現LoggingFactoryBeanCustomizer接口,源碼以下所示:

/** * 自定義建立鏈路以及單元編號 * * @author 恆宇少年 * @see LoggingFactoryBeanCustomizer * @see LoggingFactoryBean * @see org.minbox.framework.logging.client.tracer.LoggingTraceGenerator * @see org.minbox.framework.logging.client.span.LoggingSpanGenerator */
@Component
public class CustomCreateTraceAndSpanId implements LoggingFactoryBeanCustomizer {
    /** * {@link CustomTraceIdGenerator} 自定義鏈路編號生成策略 * {@link CustomSpanIdGenerator} 自定義單元編號生成策略 * * @param factoryBean {@link LoggingFactoryBean} */
    @Override
    public void customize(LoggingFactoryBean factoryBean) {
        CustomTraceIdGenerator traceIdGenerator = new CustomTraceIdGenerator();
        factoryBean.setTraceGenerator(traceIdGenerator);

        CustomSpanIdGenerator spanIdGenerator = new CustomSpanIdGenerator();
        factoryBean.setSpanGenerator(spanIdGenerator);
    }
}

複製代碼

customize這種設計方式是在SpringBoot中比較常見的,ApiBoot也沿用了這種設計方式,customize()方法提供了LoggingFactoryBean對象實例做爲參數,咱們能夠直接經過setXxx方法進行修改內定義的默認配置。

經過facetory.setTraceGenerator方法能夠修改默認的traceId生成策略。

經過facetory.setSpanGenerator方法能夠修改默認的spanId生成策略。

測試

啓動項目後咱們來查看控制檯打印的日誌內容,確認是否修改爲功。

{
	"endTime":1571711067664,
	"httpStatus":200,
	"requestBody":"",
	"requestHeaders":{
		"accept":"*/*",
		"host":"localhost:8080",
		"user-agent":"curl/7.64.1"
	},
	"requestIp":"0:0:0:0:0:0:0:1",
	"requestMethod":"GET",
	"requestParam":"{}",
	"requestUri":"/index",
	"responseBody":"this is index.",
	"responseHeaders":{},
	"serviceId":"apiboot-custom-logging-traceid",
	"serviceIp":"127.0.0.1",
	"servicePort":"8080",
	"spanId":"group-1780993769",
	"startTime":1571711067643,
	"timeConsuming":21,
	"traceId":"local1111437283"
}
複製代碼

traceIdspanId已經修改爲咱們自定義的編號生成策略方式。

敲黑板劃重點

本章節主要是講到了如何自定義traceId以及spanId,咱們能夠經過LoggingFactoryBeanCustomizerLoggingFactoryBean對象進行深度的自定義配置,有關ApiBoot Logging使用的正確姿式還有不少,敬請期待。

請結合文中前文回顧部分進行編寫測試。 做者我的 博客 使用開源框架 ApiBoot 助你成爲Api接口服務架構師

相關文章
相關標籤/搜索