SpringBoot3.0.2集成Tlog(1.5.2)时未输出TraceId等日志信息

本文描述了在Springboot3.0.2版本中集成Tlog1.5.2时遇到的TraceId输出问题,原因在于jakarta.servlet包的不兼容。作者提供了重写关键类并修改包引用的解决方法,以及自定义TraceId生成器的示例和配置。
摘要由CSDN通过智能技术生成

项目出现的问题:Springboot3.0.2版本集成Tlog(1.5.2版本)开源框架时未输出TraceId等信息。

经过搜索得知问题原因为:在Java EE 8及更高版本中,javax.servlet.*包已经替换成了jakarta.servlet.*,但是tlog还没支持到。

解决方法:重写tlog中TLogServletFilter,TLogWebCommon两个关键类将javax.servlet包的内容替换成jakarta.servlet包的内容。

代码如下先是TLogWebCommon

public class TLogWebCommon extends TLogRPCHandler {
    private static volatile TLogWebCommon tLogWebCommon;

    public static TLogWebCommon loadInstance() {
        if (tLogWebCommon == null) {
            synchronized (TLogWebCommon.class) {
                if (tLogWebCommon == null) {
                    tLogWebCommon = new TLogWebCommon();
                }
            }
        }
        return tLogWebCommon;
    }

    public void preHandle(HttpServletRequest request) {
        String traceId = request.getHeader(TLogConstants.TLOG_TRACE_KEY);
        String spanId = request.getHeader(TLogConstants.TLOG_SPANID_KEY);
        String preIvkApp = request.getHeader(TLogConstants.PRE_IVK_APP_KEY);
        String preIvkHost = request.getHeader(TLogConstants.PRE_IVK_APP_HOST);
        String preIp = request.getHeader(TLogConstants.PRE_IP_KEY);

        TLogLabelBean labelBean = new TLogLabelBean(preIvkApp, preIvkHost, preIp, traceId, spanId);

        processProviderSide(labelBean);
    }

    public void afterCompletion() {
        cleanThreadLocal();
    }
}

再是TLogFilter

public class TLogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest instanceof HttpServletRequest && servletResponse instanceof HttpServletResponse){
            try{
                TLogWebCommon.loadInstance().preHandle((HttpServletRequest)servletRequest);
                //把traceId放入response的header,为了方便有些人有这样的需求,从前端拿整条链路的traceId
                ((HttpServletResponse)servletResponse).addHeader(TLogConstants.TLOG_TRACE_KEY, TLogContext.getTraceId());
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }finally {
                TLogWebCommon.loadInstance().afterCompletion();
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

最后增加自己的过滤器

@Configuration
@ComponentScan(value = "com.yomahub.tlog")
public class LogConfig {

    @Bean
    public FilterRegistrationBean<TLogFilter> loggingFilter() {
        FilterRegistrationBean<TLogFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TLogFilter());
        registrationBean.addUrlPatterns("/*"); // 拦截所有请求路径
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

到此基本上就可以正常输出日志了!!!

另:如果自定义TranceId生成则可以重写接口或者继承实现类:

public class TestIdGenerator extends TLogIdGenerator {
    @Override
    public String generateTraceId() {
        return String.valueOf(System.nanoTime());
    }
}

public class TLogCostumeIdGenerator extends TLogDefaultIdGenerator {

    @Override
    public String generateTraceId() {
        return "自己的标识"+ super.generateTraceId();
    }
}

配置文件中配置:

tlog.id-generator=com.yomahub.tlog.example.dubbo.id.TestIdGenerator

记录:如果gateway中未按照格式输出TraceId等日志信息,可能需要增加:

<!-- 增加如下的TLog MDC Listener -->
<contextListener class="com.yomahub.tlog.core.enhance.logback.TLogLogbackTTLMdcListener"/>

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值