首页 > 其他分享 >【揭秘】Logback日志如何实现请求唯一追踪ID,提升系统监控效能!

【揭秘】Logback日志如何实现请求唯一追踪ID,提升系统监控效能!

时间:2024-10-28 13:47:51浏览次数:7  
标签:traceId MDC public 系统监控 org import Logback ID

在分布式系统中,为了方便追踪和调试问题,通常会为每个请求生成一个唯一的追踪 ID(Trace ID)。这个 ID 可以在整个请求的生命周期中传递,并在日志中记录。Logback 是一个流行的 Java 日志框架,可以通过自定义 MDC(Mapped Diagnostic Context)来实现这一功能。

以下是如何在 Logback 中添加请求唯一追踪 ID 的详细步骤:

1. 引入依赖

首先,确保你的项目中已经包含了 Logback 的依赖。如果你使用的是 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

2. 配置 Logback

接下来,需要配置 Logback 以支持 MDC。你可以在 src/main/resources 目录下创建一个 logback.xml 文件,并添加以下内容:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %X{traceId}%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

在这个配置文件中,我们定义了一个控制台输出的 appender,并使用 %X{traceId} 来输出 MDC 中的 traceId

3. 生成和设置 Trace ID

在你的应用程序中,你需要为每个请求生成一个唯一的 Trace ID,并将其放入 MDC。假设你在使用 Spring Boot,可以在过滤器或拦截器中实现这一点。

使用过滤器

创建一个过滤器类,用于生成和设置 Trace ID:

import org.slf4j.MDC;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;

public class TraceIdFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            String traceId = UUID.randomUUID().toString();
            MDC.put("traceId", traceId);
            chain.doFilter(request, response);
        } finally {
            MDC.remove("traceId");
        }
    }

    @Override
    public void destroy() {
        // 销毁代码
    }
}
注册过滤器

在 Spring Boot 应用中,可以通过 @Bean 注解将过滤器注册到应用上下文中:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<TraceIdFilter> loggingFilter(){
        FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TraceIdFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

4. 测试日志输出

现在,当你的应用程序处理请求时,每个日志条目都会包含一个唯一的 Trace ID。例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @GetMapping("/test")
    public String test() {
        logger.info("This is a test log message");
        return "Check the logs for the trace ID!";
    }
}

启动应用程序并访问 /test 端点,你应该会在控制台中看到类似以下的日志输出:

2023-10-01 12:00:00 [http-nio-8080-exec-1] INFO  com.example.TestController - This is a test log message 123e4567-e89b-12d3-a456-426614174000

其中 123e4567-e89b-12d3-a456-426614174000 就是生成的 Trace ID。通过这种方式,你可以很容易地在分布式系统中追踪和调试请求。

标签:traceId,MDC,public,系统监控,org,import,Logback,ID
From: https://blog.csdn.net/LA1245780/article/details/143301051

相关文章

  • 【揭秘】如何用ConstraintValidator自定义校验注解,让你的代码更简洁高效!
    在Java中,自定义校验注解(CustomValidationAnnotation)通常用于BeanValidation框架(如HibernateValidator),以便对特定字段或方法参数进行验证。以下是如何创建和使用自定义校验注解的详细步骤和代码示例:1.定义自定义校验注解首先,我们需要定义一个自定义校验注解。这个注解需......
  • 【Java】【SpringBoot】logback开发环境配置
    LogBack开发环境配置Logback是一个开源的日志记录库,它是log4j的一个改进版本。Logback被设计为易于使用,同时提供强大的日志管理功能。1.添加依赖在pom.xml文件中添加依赖:<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <vers......
  • orchard core 2 的user模块,添加phonenumber手机号的liquid支持
    老外习惯用email,我们要求的是要手机号。所以除了采用二次验证(2FA),发现工作流要给用户发送通知短信无法获取对应的手机号。所以对源码进行扩展增加了liquid获取手机号。1、下载源码可以clone也可以下载2、找到对应modules的user模块直接在starup.cs找到LiquidStartup添加显......
  • Android15音频进阶之音频策略加载及使用(九十一)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • C# 中的 public、static 和 void 关键字有什么区别
    在C#编程语言中,public、static和void都是关键字,但它们具有不同的目的和用途。public是一个访问修饰符,表示类或类的成员可以从任何地方访问;static指定某一成员属于类型本身,而不是某个对象实例;而void是一个返回类型,表示方法不返回任何值。理解这三个关键字的核心差异对于编写高效和......
  • 基于stm32的rfid智能农场物联网单片机软硬件设计毕业生系统
    (1)硬件端STM32F103C8T6:用于所有程序的中控和模块数据通信;0.96寸OLDE:用于显示当前设备状态以及实时温度;蜂鸣器:用于设备状态的提示和报警;RFID读卡器:使用读卡器功能进行卡号读取,并作为唯一标识体温传感器:检测到体温并且读卡器读取的卡号为牛的唯一标识,则将数据打包上传到app进行保......
  • IT软件部落测评推荐手绘工具神器Excalidraw素描草图风格白板,支持AI-开源免费
    IT软件部落测评推荐手绘工具神器Excalidraw素描草图风格白板,支持AI-开源免费原创 IT软件部落 IT软件部落Excalidraw 一个开源的虚拟手绘风格的白板,是一个很好的素描工具。它真的很容易使用,可以在几分钟内创建令人惊叹的草图。它提供了一系列美妙的基本形状和功能。您可以......
  • IDEA如何快速复制日志生成sql语句,太妙啦
    前言我们在使用IDEA开发Java应用时,一般来说,是使用springboot+mybatis的框架。同时,开发过程中,遇到BUG在所难免。其中,有一类BUG就是数据库的报错。正常来说,我们本地调试时,都会在日志里面打印出对应的sql日志,但这类日志我们不能直接使用,因为还可能有一些参数在填充,我们得复制所有的......
  • 如何在Android Studio中配置模拟器
    在AndroidStudio中配置模拟器需遵循以下步骤:1、打开AVD管理器;2、创建新的虚拟设备;3、选择合适的系统镜像;4、配置虚拟设备硬件参数;5、启动模拟器。在这些步骤中,选择合适的系统镜像至关重要,因为它决定了模拟器运行的Android版本和API级别,同时也影响应用的兼容性测试。开发者应根据......
  • MySQL的自增ID用完了应该怎么办
    一种解决方法是使用BIGINT数据类型。BIGINT数据类型的最大值是9223372036854775807,这比INT数据类型大得多。如果您使用BIGINT数据类型来存储自增ID,那么您的表可以插入更多的数据。一、MySQL的自增ID用完了应该怎么办解决方案1:使用BIGINT数据类型一种解决方法是使用BIGINT数......