自定义ApiBoot Logging链路以及单元ID
ApiBoot Logging
会为每一个请求都对应创建链路编号(TraceID
)以及单元编号(SpanID
),用于归类每一次请求日志,通过一个链路下日志单元的Parent SpanID
可以进行上下级关系的梳理。
前文回顾
- /apiboot-unified-manage-request-logs.html
- /apiboot-report-logs-by-logging-to-admin.html
了解链路编号的传递方式
在每一次请求中链路编号(traceId
)、单元编号(spanId)
都是通过HttpHeader
的方式进行传递,日志的起始位置会主动生成traceId
、spanId
,而起始位置的Parent SpanId
则是不存在的,值为null
。
这样每次通过restTemplate
、Openfeign
的形式访问其他服务的接口时,就会携带起始位置生成的traceId
、spanId
到下一个服务单元。
默认编号
ApiBoot Logging
内部提供了默认的编号格式,默认为通用格式,没有区分性,无法从编号上进行区分日志的具体归类。
默认的链路编号
ApiBoot Logging
内部通过集成minbox-logging
日志组件来完成日志的采集等基本功能,每一次生成采集的日志时都会通过LoggingTraceGenerator接口进行生成链路编号(TraceID
),该接口源码如下所示:
1 | /** |
ApiBoot Logging
默认的链路编号(TraceID
)采用的是UUID随机字符串的方式生成的,内部实现是通过LoggingTraceGenerator接口的默认实现类LoggingDefaultTraceGenerator进行生成,生成类源码如下所示:
1 | /** |
默认的单元编号
单元编号
是一条链路下经过的每一个业务单元的唯一标识,在SpringCloud
微服务的场景下每发起一个请求内部通过Openfeign
可能会经过多个服务
,这样每经过的一个服务称之为单元,而当前这条链路下的单元唯一标识字符串就称为单元编号
。
minbox-logging
提供了生成单元编号
的接口LoggingSpanGenerator,源码如下所示:
1 | /** |
spanId
默认采用的跟traceId
生成方式一致,都是UUID
随机字符串,minbox-logging
提供了LoggingSpanGenerator接口默认的实现LoggingDefaultSpanGenerator,源码如下所示:
1 | /** |
自定义编号
我们可以根据自己的业务进行自定义traceId
、spanId
,可以加入一些自己业务的元素,只需要提供minbox-logging
提供的生成traceId
的接口LoggingTraceGenerator、生成spanId
的接口LoggingSpanGenerator对应的实现类,并将实现类交给LoggingFaceBean
管理即可。
自定义链路编号
1 | /** |
我们创建名为CustomTraceIdGenerator
的类并实现LoggingTraceGenerator
接口,实现createTraceId()
方法的返回值根据local-
作为前缀,拼接UUID
随机字符串的hashCode
值作为后缀。
自定义单元编号
1 | /** |
我们创建名为CustomSpanIdGenerator
的类并实现LoggingSpanGenerator
接口,在createSpanId()
方法的返回值根据group-
作为前缀,使用UUID
随机字符串的hashCode
值作为后缀。
在上面我们已经创建了自定义traceId
以及spanId
的实现类,我们需要将实现类的实例交给LoggingFactoryBean
管理,这样我们才可以实现自定义编号。
LoggingFactoryBeanCustomizer
ApiBoot Logging
提供了一个自定义设置LoggingFactoryBean
的接口LoggingFactoryBeanCustomizer,通过该接口可以修改LoggingFactoryBean
内允许修改的任意值。
我们创建名为CustomCreateTraceAndSpanId类并实现LoggingFactoryBeanCustomizer
接口,源码如下所示:
1 | /** |
customize
这种设计方式是在SpringBoot
中比较常见的,ApiBoot
也沿用了这种设计方式,customize()
方法提供了LoggingFactoryBean
对象实例作为参数,我们可以直接通过setXxx
方法进行修改内定义的默认配置。
通过facetory.setTraceGenerator
方法可以修改默认的traceId
生成策略。
通过facetory.setSpanGenerator
方法可以修改默认的spanId
生成策略。
测试
启动项目后我们来查看控制台打印的日志内容,确认是否修改成功。
1 | { |
traceId
、spanId
已经修改成我们自定义的编号生成策略方式。
敲黑板划重点
本章节主要是讲到了如何自定义traceId
以及spanId
,我们可以通过LoggingFactoryBeanCustomizer
对LoggingFactoryBean
对象进行深度的自定义配置,有关ApiBoot Logging
使用的正确姿势还有很多,敬请期待。
请结合文中前文回顾部分进行编写测试。
代码示例
如果您喜欢本篇文章请为源码仓库点个Star
,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-custom-logging-traceid
:
自定义ApiBoot Logging链路以及单元ID