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

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

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中如何使用

添加拦截器

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);
	}

}

注册拦截器

@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中的键名称一致

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

添加一个controller调用测试

@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全链路调用日志跟踪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis优化检索的方法详解

    Mybatis优化检索的方法详解

    MyBatis是一款优秀的基于Java的持久层框架,它可以将 SQL 语句和数据库中的记录映射成为 Java 对象,并且支持灵活的 SQL 查询语句,在Mybatis中,可以使用动态SQL来灵活构造SQL语句,从而满足各种不同的检索需求,本文介绍Mybatis如何优化检索,需要的朋友可以参考下
    2024-05-05
  • Springboot+Mybatis-plus不使用SQL语句进行多表添加操作及问题小结

    Springboot+Mybatis-plus不使用SQL语句进行多表添加操作及问题小结

    这篇文章主要介绍了在Springboot+Mybatis-plus不使用SQL语句进行多表添加操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 利用Java实现复制Excel工作表功能

    利用Java实现复制Excel工作表功能

    这篇文章主要给大家介绍了关于如何利用Java实现复制Excel工作表功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Java中图片转换为Base64的示例及注意事项

    Java中图片转换为Base64的示例及注意事项

    本文介绍了Base64编码的概念及其作用,同时列举了在实现图片转换为Base64过程中需要注意的问题,包括文件大小、读取异常、图片格式、网络传输效率以及数据安全性等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    本篇文章主要介绍了四种生成和解析XML文档的方法,即:DOM、SAX、JDOM和DOM4J,具有一定的参考价值,有兴趣的可以了解一下。
    2016-11-11
  • Java 如何安全的发布对象

    Java 如何安全的发布对象

    这篇文章主要介绍了Java 如何安全的发布对象,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • java9迁移注意问题总结

    java9迁移注意问题总结

    本篇文章给大家详细整理了java9迁移注意的问题,希望我们整理的内容能够帮助到大家。
    2018-02-02
  • 使用JPA+querydsl如何实现多条件动态查询

    使用JPA+querydsl如何实现多条件动态查询

    这篇文章主要介绍了使用JPA+querydsl如何实现多条件动态查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详解Java的MyBatis框架中SQL语句映射部分的编写

    详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下
    2016-04-04
  • SpringBoot集成ENC对配置文件进行加密的流程步骤

    SpringBoot集成ENC对配置文件进行加密的流程步骤

    Spring Boot Encoder,即Spring Boot加密模块,它提供了一种简单的方式来集成安全编码功能到Spring Boot应用程序中,它是Spring Security框架的一部分,旨在帮助开发者轻松地处理数据加密,本文给大家介绍了SpringBoot集成ENC对配置文件进行加密的流程步骤
    2024-12-12

最新评论