SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

 更新时间:2021年05月13日 09:26:19   作者:kevin_ying  
本文重点给大家介绍Tracer集成的slf4j MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId,文章通过代码给大家讲解了在springboot中使用的技巧,感兴趣的朋友跟随小编一起看看吧

Java技术迷

SpringBoot中除了常见的分布式链路跟踪系统zipkin、skywalking等,如果需要快速定位一次请求的所有日志,那么该如何实现?实际slf4j提供了MDC(Mapped Diagnostic Contexts)功能,支持用户定义和修改日志的输出格式以及内容。本文将介绍 Tracer集成的slf4j MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId。

MDC介绍

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。

springboot中如何使用

添加拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LogInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String tid = UUID.randomUUID().toString().replace("-", "");
        MDC.put(CloudConstant.MDC_TRACE, tid);
        return true;
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
        MDC.remove(CloudConstant.MDC_TRACE);
    }
 
}

注册拦截器

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class WebInterceptorAdapter implements WebMvcConfigurer {
    @Bean
    public LogInterceptor logInterceptor() {
        return new LogInterceptor();
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor());
    }
}

修改日志输出格式,添加%X{traceId},traceId和MDC中的键名称一致

1
<pattern>%date %-5level ${PID:- } [%thread] [%X{tid}] : /*[%logger{50}:%line] %msg*/%n</pattern>

添加一个controller调用测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
@RequestMapping("trace")
@Slf4j
public class TestTraceController {
 
    @GetMapping("traceLog")
    public String traceLog() {
        log.info("---接口调用了---");
        traceService();
        return "success";
    }
 
    private void traceService(){
        log.error("## 执行traceService方法");
    }
}

日志打印如下,我们可以通过traceId快速查找出同一个请求的所有日志

细心的同学就会发现,MDC还是存在一些问题

  • 在子线程中打印日志丢失traceId
  • HTTP调用丢失traceId

下一篇文章中小编继续讲解子线程中如何实现traceId的日志跟踪

到此这篇关于SpringBoot+slf4j实现全链路调用日志跟踪 一的文章就介绍到这了,更多相关SpringBoot全链路调用日志跟踪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://www.cnblogs.com/kevin-ying/p/14483171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • 微信公众号开发之回复图文消息java代码

    微信公众号开发之回复图文消息java代码

    这篇文章主要为大家详细介绍了微信公众号开发之回复图文消息java代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 在springboot中添加mvc功能的正确姿势讲解

    在springboot中添加mvc功能的正确姿势讲解

    这篇文章主要介绍了在springboot中添加mvc功能的正确姿势,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • JAVA抛出异常的三种形式详解

    JAVA抛出异常的三种形式详解

    这篇文章主要介绍了JAVA抛出异常的三种形式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • JAVA利用泛型返回类型不同的对象方法

    JAVA利用泛型返回类型不同的对象方法

    下面小编就为大家带来一篇JAVA利用泛型返回类型不同的对象方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • java调用webservice接口,并解析返回参数问题

    java调用webservice接口,并解析返回参数问题

    这篇文章主要介绍了java调用webservice接口,并解析返回参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 关于Java的动态代理机制

    关于Java的动态代理机制

    这篇文章主要介绍了关于Java的动态代理机制,动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术,需要的朋友可以参考下
    2023-05-05
  • SpringBoot整合Caffeine使用示例

    SpringBoot整合Caffeine使用示例

    Spring Boot 和 Caffeine 可以很容易地进行整合,Caffeine 是一个现代化的 Java 缓存库,提供了高性能和灵活的缓存策略,本文给大家介绍了SpringBoot整合Caffeine使用示例,需要的朋友可以参考下
    2024-07-07
  • Java对比两个实体的差异分析

    Java对比两个实体的差异分析

    这篇文章主要介绍了Java对比两个实体的差异分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java实现的RSA加密算法详解

    java实现的RSA加密算法详解

    这篇文章主要介绍了java实现的RSA加密算法,结合实例形式详细分析了RSA加密解密的原理、java实现方法及相关注意事项,需要的朋友可以参考下
    2017-06-06
  • javaweb实现注册登录页面

    javaweb实现注册登录页面

    这篇文章主要为大家详细介绍了javaweb实现注册登录页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论