栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

自定义ApiBoot Logging链路以及单元ID生成策略

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义ApiBoot Logging链路以及单元ID生成策略

ApiBoot Logging会为每一个请求都对应创建链路编号(TraceID)以及单元编号(SpanID),用于归类每一次请求日志,通过一个链路下日志单元的Parent SpanID可以进行上下级关系的梳理。

前文回顾
  • 使用ApiBoot Logging进行统一管理请求日志

  • 将ApiBoot Logging采集的日志上报到Admin

了解链路编号的传递方式

在每一次请求中链路编号(traceId)、单元编号(spanId)都是通过HttpHeader的方式进行传递,日志的起始位置会主动生成traceId、spanId,而起始位置的Parent SpanId则是不存在的,值为null。

这样每次通过restTemplate、Openfeign的形式访问其他服务的接口时,就会携带起始位置生成的traceId、spanId到下一个服务单元

默认编号

ApiBoot Logging内部提供了默认的编号格式,默认为通用格式,没有区分性,无法从编号上进行区分日志的具体归类。

默认的链路编号

ApiBoot Logging内部通过集成minbox-logging日志组件来完成日志的采集等基本功能,每一次生成采集的日志时都会通过LoggingTraceGenerator接口进行生成链路编号(TraceID),该接口源码如下所示:


public interface LoggingTraceGenerator {
    
    String createTraceId() throws MinBoxLoggingException;

}

ApiBoot Logging默认的链路编号(TraceID)采用的是UUID随机字符串的方式生成的,内部实现是通过LoggingTraceGenerator接口的默认实现类LoggingDefaultTraceGenerator进行生成,生成类源码如下所示:


public class LoggingDefaultTraceGenerator implements LoggingTraceGenerator {
    
    @Override
    public String createTraceId() throws MinBoxLoggingException {
 return UUID.randomUUID().toString();
    }
}

默认的单元编号

单元编号是一条链路下经过的每一个业务单元的唯一标识,在SpringCloud微服务的场景下每发起一个请求内部通过Openfeign可能会经过多个服务,这样每经过的一个服务称之为单元,而当前这条链路下的单元唯一标识字符串就称为单元编号。

minbox-logging提供了生成单元编号的接口LoggingSpanGenerator,源码如下所示:


public interface LoggingSpanGenerator {
    
    String createSpanId() throws MinBoxLoggingException;
}

spanId默认采用的跟traceId生成方式一致,都是UUID随机字符串,minbox-logging提供了LoggingSpanGenerator接口默认的实现LoggingDefaultSpanGenerator,源码如下所示:


public class LoggingDefaultSpanGenerator implements LoggingSpanGenerator {
    
    @Override
    public String createSpanId() throws MinBoxLoggingException {
 return UUID.randomUUID().toString();
    }
}
自定义编号

我们可以根据自己的业务进行自定义traceId、spanId,可以加入一些自己业务的元素,只需要提供minbox-logging提供的生成traceId的接口LoggingTraceGenerator、生成spanId的接口LoggingSpanGenerator对应的实现类,并将实现类交给LoggingFaceBean管理即可。

自定义链路编号

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值作为后缀。

自定义单元编号

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接口,源码如下所示:


@Component
public class CustomCreateTraceAndSpanId implements LoggingFactoryBeanCustomizer {
    
    @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使用的正确姿势还有很多,敬请期待。

请结合文中前文回顾部分进行编写测试。
作者个人 博客
使用开源框架 ApiBoot 助你成为Api接口服务架构师

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号