You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Sleuth检查对象状态?如何追踪字段并查看Span中对象日志详情

使用Spring Cloud Sleuth追踪特定对象字段并在日志中查看

当然可以实现,下面是两种常用的实现方案,能把自定义对象的信息添加到Span中,同时在日志里展示:

1. 手动操作当前Span注入对象信息

通过注入Tracer对象获取当前活跃的Span,将对象序列化后以标签(Tag)或日志事件(Event)的形式添加进去:

代码示例

import org.springframework.cloud.sleuth.Tracer;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Service;

@Service
public class ObjectProcessingService {
    private final Tracer tracer;
    private final ObjectMapper objectMapper;

    // 构造注入依赖
    public ObjectProcessingService(Tracer tracer, ObjectMapper objectMapper) {
        this.tracer = tracer;
        this.objectMapper = objectMapper;
    }

    public void processTargetObject(YourCustomObject targetObj) {
        try {
            // 将自定义对象序列化为JSON字符串
            String objJson = objectMapper.writeValueAsString(targetObj);
            
            // 添加为Span标签,可在Zipkin UI和日志中查看
            tracer.currentSpan().tag("custom.object.details", objJson);
            
            // 可选:添加Span日志事件,记录对象处理的关键节点
            tracer.currentSpan().event("object_processed", objJson);
        } catch (Exception e) {
            // 捕获序列化异常并标记到Span
            tracer.currentSpan().tag("object.serialization.error", e.getMessage());
        }
    }
}

2. 结合@NewSpan与SpanCustomizer实现

如果使用@NewSpan注解创建新Span,可以通过SpanCustomizer参数直接为Span添加自定义标签:

代码示例

import org.springframework.cloud.sleuth.SpanCustomizer;
import org.springframework.cloud.sleuth.annotation.NewSpan;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Service;

@Service
public class AnotherProcessingService {
    private final ObjectMapper objectMapper;

    public AnotherProcessingService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @NewSpan(name = "handle_custom_object")
    public void handleTargetObject(YourCustomObject targetObj, SpanCustomizer spanCustomizer) {
        try {
            String objStr = objectMapper.writeValueAsString(targetObj);
            // 为当前Span添加自定义对象标签
            spanCustomizer.tag("custom.target.object", objStr);
        } catch (Exception e) {
            spanCustomizer.tag("object.error", "序列化失败:" + e.getMessage());
        }
    }
}

配置日志展示自定义Span标签

要在日志中看到这些自定义字段,需要调整日志格式,将Span的自定义标签加入输出模板:

在application.yml中配置

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} [traceId:%X{traceId},spanId:%X{spanId},customObj:%X{custom.object.details:-}] - %msg%n"

或者在logback.xml中配置

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [traceId:%X{traceId},spanId:%X{spanId},customObj:%X{custom.object.details}] - %msg%n</pattern>
    </encoder>
</appender>

注意事项

  • 序列化对象时要过滤敏感信息,避免数据泄露
  • 不要将过大的对象存入Span标签,防止Span数据体积过大影响性能
  • 添加的标签会同步显示在Zipkin UI的Span详情页面中,便于链路追踪时查看对象上下文

内容的提问来源于stack exchange,提问作者Ege Coskun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:55:41