ApiBoot Logging
會爲每個請求都對應建立鏈路編號(TraceID
)以及單元編號(SpanID
),用於歸類每一次請求日誌,經過一個鏈路下日誌單元的Parent SpanID
能夠進行上下級關係的梳理。html
在每一次請求中鏈路編號(traceId
)、單元編號(spanId)
都是經過HttpHeader
的方式進行傳遞,日誌的起始位置會主動生成traceId
、spanId
,而起始位置的Parent SpanId
則是不存在的,值爲null
。github
這樣每次經過restTemplate
、Openfeign
的形式訪問其餘服務的接口時,就會攜帶起始位置生成的traceId
、spanId
到下一個服務單元。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();
}
}
複製代碼
咱們能夠根據本身的業務進行自定義traceId
、spanId
,能夠加入一些本身業務的元素,只須要提供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
管理,這樣咱們才能夠實現自定義編號。
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"
}
複製代碼
traceId
、spanId
已經修改爲咱們自定義的編號生成策略方式。
本章節主要是講到了如何自定義traceId
以及spanId
,咱們能夠經過LoggingFactoryBeanCustomizer
對LoggingFactoryBean
對象進行深度的自定義配置,有關ApiBoot Logging
使用的正確姿式還有不少,敬請期待。