SpringBoot使用TraceId日志链路追踪-1

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

项目场景:

有时候一个业务调用链场景,很长,调了各种各样的方法,看日志的时候,各个接口的日志穿插,确实让人头大。为了解决这个痛点,就使用了TraceId,根据TraceId关键字进入服务器查询日志中是否有这个TraceId,这样就把同一次的业务调用链上的日志串起来了,当前适合配置微服务中的简单分布式日志追踪,特别复杂的还是推荐Skywalker。

springboot

一个简单的springboot无需其他依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    <!--lombok配置-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>
</dependencies>

整合logback,打印日志,logback-spring.xml (简单配置下)

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--日志存储路径-->
    <property name="log" value="D:/test/log" />
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--输出格式化-->
            <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按天生成日志文件 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件名-->
            <FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
 
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
</configuration>

application.yml

server:
  port: 8826
logging:
  config: classpath:logback-spring.xml

自定义日志拦截器 LogInterceptor.java

用途:每一次链路,线程维度,添加最终的链路ID traceId。

MDC(Mapped Diagnostic Context)诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。

import org.slf4j.MDC;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
 
/**
 * 日志拦截器
 */
public class LogInterceptor implements HandlerInterceptor {
 
    private static final String traceId = "traceId";
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String tid = UUID.randomUUID().toString().replace("-", "");
        //可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成,这里也支持feign方式调用其他服务接口前提是要在请求头中把traceId带过去
        if (!StringUtils.isEmpty(request.getHeader("traceId"))){
            tid=request.getHeader("traceId");
        }
        MDC.put(traceId, tid);
        return true;
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏
        MDC.remove(traceId);
    }
 
}

WebConfigurerAdapter.java 添加拦截器

import javax.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
 
@Configuration
public class WebConfigurerAdapter extends WebMvcConfigurationSupport {
    @Resource
	private LogInterceptor logInterceptor;
 
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(logInterceptor);
		//可以具体制定哪些需要拦截,哪些不拦截,其实也可以使用自定义注解更灵活完成
//                .addPathPatterns("/**")
//                .excludePathPatterns("/testxx.html");
	}
}

接口测试

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
 
@RestController
@Api(tags = "测试接口")
@RequestMapping("/test")
@Slf4j
public class TestController {
 
 
	@RequestMapping(value = "/log", method = RequestMethod.GET)
	@ApiOperation(value = "测试日志")
	public String sign() {
		log.info("这是一行info日志");
		log.error("这是一行error日志");
		return "success";
	}
}

因为我这里根据我自己的项目进行了改造,因此截图部分的日志和上面的配置不通,但是大体相差不大,可以看出这里已经把这个traceId打印出来了,即便是分布式定时任务,它执行时也会生成一个traceId带出来,这样分析日志时我们只用重点关注traceId对应的值的日志即可。如果后续把日志接入ES中那么可以直接筛选出该对应traceId的调用链路的全部日志

在这里插入图片描述

原文转载

https://blog.youkuaiyun.com/u011974797/article/details/143682368

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>首先,用户的问题是关于在Spring Boot 3中使用micrometer-tracing-bridge-brave实现链路追踪日志收集的方法。我需要基于提供的站内引用来回答。 回顾引用内容: - 引用[1]: 介绍了Micrometer Tracing、Zipkin、Brave等组件,以及相关依赖如micrometer-observation、micrometer-tracing-bridge-brave、zipkin-reporter-brave、spring-boot-starter-actuator、feign-micrometer。简要说明了Brave的功能。 - 引用[2]: 描述了Micrometer Tracing是基于Micrometer的分布式追踪解决方案,集成了Zipkin或Jaeger,用于追踪请求。 - 引用[3]: 解释了链路追踪的概念,如Trace ID和Span ID,以及Zipkin的作用。 用户的问题具体是:在Spring Boot 3中使用micrometer-tracing-bridge-brave实现链路追踪日志收集的方法。 我的回答需要: - 使用中文。 - 结构清晰,逐步解决问题。 - 参考提供的引用。 - 在引用的段落末尾自然地添加引用标识,例如[^1]。 - 生成相关问题。 - 对于数学表达式,使用正确的LaTeX格式(但在这个主题中,可能没有数学表达式,所以我可以忽略)。 - 确保回答真实可靠。 关键点: - 用户指定了Spring Boot 3。 - 使用micrometer-tracing-bridge-brave。 - 实现链路追踪日志收集。 我需要构建一个结构化的回答: 1. **引言**: 简要解释什么是链路追踪和在Spring Boot中的重要性。 2. **依赖设置**: 描述如何添加必要的依赖,特别是针对Spring Boot 3。 3. **配置**: 如何配置Micrometer Tracing、Brave和Zipkin。 4. **日志收集**: 如何集成日志收集(例如,使用SLF4J和MDC)。 5. **示例代码**: 提供代码片段来展示实现。 6. **验证**: 如何测试和验证追踪。 7. **引用**: 自然地引用提供的内容。 8. **相关问题**: 在最后生成相关问题。 从引用中提取相关信息: - 引用[1]: 提到了依赖,如micrometer-tracing-bridge-brave和zipkin-reporter-brave。 - 引用[2]: 描述了Micrometer Tracing的功能。 - 引用[3]: 解释了Trace ID和Span ID。 对于Spring Boot 3,我需要确保依赖是兼容的。Spring Boot 3使用Spring Framework 6,可能对依赖版本有要求。我应该建议使用最新稳定版。 **步骤实现链路追踪**: 1. 添加依赖到pom.xml(如果使用Maven)。 2. 配置application.properties或application.yml。 3. 确保日志记录集成Trace ID(使用MDC)。 4. 发送追踪数据到Zipkin或其他后端。 **日志收集**: 链路追踪通常包括Trace ID在日志中,以便关联日志追踪。这可以通过配置日志框架(如Logback或Log4j2)来输出MDC中的Trace ID。 生成相关问题: - 类似于示例,例如: 1. 如何优化Micrometer Tracing的性能? 2. Micrometer Tracing与其他工具的比较? 3. 如何处理追踪数据的安全性? 确保回答中自然地添加引用: - 当提到Brave时,引用[^1]。 - 当提到Micrometer Tracing时,引用[^2]。 - 当提到Trace ID和Span ID时,引用[^3]。 现在,起草回答结构: - **开头**: 解释链路追踪的重要性。 - **添加依赖**: 列出必要的依赖。 - **配置**: 设置Zipkin报告器和日志- **示例**: 提供简单的代码示例。 - **日志收集**: 描述如何集成日志- **结尾**: 总结并生成相关问题。 </think>### Spring Boot 3中使用micrometer-tracing-bridge-brave实现链路追踪日志收集的方法 在Spring Boot 3中,通过集成Micrometer Tracing和Brave,可以实现分布式链路追踪日志收集。这有助于监控请求在微服务架构中的流转路径和性能问题。Brave是一个开源的分布式跟踪工具,它使用“跟踪上下文”机制在请求头中存储Trace ID和Span ID,确保请求链的可追踪性[^1]。Micrometer Tracing则基于Micrometer指标库,提供与Zipkin等系统的集成支持,用于收集和报告追踪数据[^2]。一条完整的链路追踪会在每个服务调用时添加Trace ID(唯一标识请求链)和Span ID(标识每个请求步骤), 各Span通过parent ID关联起来[^3]。以下我将逐步介绍实现方法,确保依赖、配置和代码正确。 #### 步骤1: 添加必要依赖 在Spring Boot 3项目中,需添加Micrometer Tracing、Brave和Zipkin的依赖。Spring Boot 3默认支持Micrometer集成,因此使用Spring Boot Starter简化配置。在Maven的`pom.xml`中添加以下依赖(确保版本兼容Spring Boot 3,如使用Spring Boot 3.2.x或更高): ```xml <dependencies> <!-- Spring Boot Actuator for monitoring --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- Micrometer Tracing with Brave bridge --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <version>1.2.0</version> <!-- 推荐使用最新版本 --> </dependency> <!-- Zipkin reporter for Brave --> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> <version>2.17.0</version> </dependency> <!-- Optional: For HTTP client tracing (e.g., WebClient or Feign) --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> <version>12.5</version> </dependency> <!-- Ensure logging integration (e.g., Logback) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 这些依赖包括: - `micrometer-tracing-bridge-brave`: 作为Brave的桥梁,收集分布式跟踪数据[^1]。 - `zipkin-reporter-brave`: 将Brave数据报告到Zipkin后端[^1]。 - `spring-boot-starter-actuator`: 提供监控端点,暴露追踪指标[^1]。 - `feign-micrometer`: 可选,用于HTTP客户端追踪。 #### 步骤2: 配置应用属性 在`application.properties`或`application.yml`中配置Zipkin报告器和日志设置。Spring Boot 3自动检测这些配置,简化集成: ```properties # 启用Zipkin报告器 management.tracing.enabled=true management.zipkin.tracing.endpoint=http://localhost:9411/api/v2/spans # Zipkin服务器地址(默认本地9411端口) management.tracing.sampling.probability=1.0 # 采样率,1.0表示收集所有请求 # 配置日志输出Trace ID(日志收集关键) logging.pattern.level=%5p [${spring.application.name:-},%X{traceId:-},%X{spanId:-}] # 在日志中添加Trace ID和Span ID management.endpoints.web.exposure.include=health,metrics,trace # 暴露Actuator端点 ``` - **链路追踪配置**: 启用追踪并指向Zipkin服务器。Brave会自动处理请求头中的Trace ID和Span ID传递[^3]。 - **日志收集配置**: 使用`logging.pattern.level`集成MDC(Mapped Diagnostic Context),将Trace ID注入日志格式。这样每条日志都会包含Trace ID,便于在日志系统(如ELK或Splunk)中关联追踪数据[^2]。 #### 步骤3: 实现服务端追踪Spring Boot应用中,使用`@RestController`或服务类时,Brave会自动拦截请求添加追踪上下文。例如,创建一个简单控制器: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import io.micrometer.tracing.Tracer; // 导入Tracer接口 @RestController public class TraceController { private final Tracer tracer; // 注入Tracer Bean public TraceController(Tracer tracer) { this.tracer = tracer; } @GetMapping("/trace") public String traceEndpoint() { // 手动添加Span(可选,Brave默认自动处理) Span span = tracer.nextSpan().name("custom-span").start(); try (var ignored = tracer.withSpan(span)) { // 模拟服务逻辑 return "Trace ID: " + tracer.currentSpan().context().traceId(); // 输出当前Trace ID } finally { span.end(); // 结束Span } } } ``` - **自动追踪**: Spring Boot 3的AOP机制会自动为HTTP请求创建Span。使用`Tracer` Bean(由`micrometer-tracing-bridge-brave`提供)可以手动管理Span[^1]。 - **日志集成**: 在日志文件中,Trace ID会像`INFO [app-name,1234567890abcdef,56789]`一样输出,便于查询关联。 #### 步骤4: 配置日志收集与Zipkin可视化 - **日志收集**: 确保日志框架(如Logback)输出到文件或集中式系统(如ELK Stack)。在`logback-spring.xml`中添加配置: ```xml <configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/application.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - [TraceID: %X{traceId}, SpanID: %X{spanId}] %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration> ``` 这强制每条日志包含Trace ID和Span ID,实现日志追踪的关联[^3]。 - **Zipkin可视化**: 启动Zipkin服务(如Docker容器): ```bash docker run -d -p 9411:9411 openzipkin/zipkin ``` 访问`http://localhost:9411`查看追踪数据。请求通过Brave报告到Zipkin后,Zipkin会展示请求路径、耗时和日志关联[^1]。 #### 步骤5: 测试和验证 1. **启动应用**: 运行Spring Boot 3应用,访问`http://localhost:8080/trace`触发请求。 2. **检查日志**: 在`application.log`中查看Trace ID,如`2024-10-01 12:00:00 INFO [http-nio-8080-exec-1] - [TraceID: 123456, SpanID: 7890] Endpoint called`。 3. **Zipkin验证**: 在Zipkin UI中搜索Trace ID,确认请求链可视化(包括服务和Span详情)。 4. **Actuator端点**: 访问`http://localhost:8080/actuator/trace`查看本地追踪数据[^1]。 #### 注意事项 - **性能影响**: 采样率`management.tracing.sampling.probability`设为1.0可能增加负载,生产环境可调整为0.1[^2]。 - **安全性**: 确保Zipkin端点安全(如使用Spring Security)。 - **兼容性**: Spring Boot 3与Micrometer Tracing 1.x完全兼容,避免版本冲突。 通过以上方法,您可以在Spring Boot 3中高效实现链路追踪日志收集。Brave处理追踪上下文,Zipkin提供可视化,Micrometer Tracing桥接两者并集成日志[^1][^2][^3]。如有问题,可以从Actuator端点排查追踪数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值