Java实现接口调用链日志的核心是通过统一traceId串联多服务请求,推荐Spring Cloud Sleuth+Zipkin方案自动注入traceId/spanId到MDC并支持可视化;单体可自定义Filter+MDC实现,需注意异步透传与HTTP头传递(如X-Trace-ID或B3协议),日志应结构化、含业务标识且异常保留堆栈。
Java中实现接口调用链日志,核心是把一次请求在多个服务(或模块)间的流转过程串联起来,形成可追溯的完整链路。关键在于统一传递和维护一个全局唯一的追踪ID(如
traceId
),并在每个日志输出中自动携带它。
使用Spring Cloud Sleuth + Zipkin(推荐用于微服务)
这是目前最主流、开箱即用的分布式链路追踪方案:
Sleuth 自动为每个请求生成
traceId
和
spanId
,并注入到日志 MDC(Mapped Diagnostic Context)中
只需在
application.yml
中配置
,日志行就会自动带上 traceId 和 spanId
搭配 Zipkin Server 可视化查看调用拓扑、耗时、异常等;支持 HTTP、MQ、Feign、RestTemplate、OpenFeign 等组件的自动埋点
注意:需确保上下游服务都引入 Sleuth 依赖,并传播 B3 或 W3C 格式头(如
)
自定义 Filter + MDC(适合单体或轻量级场景)
不依赖外部组件,用几行代码即可实现基础链路标识:
写一个
TraceIdFilter
,在请求进入时生成唯一 traceId(如用
),存入
在日志配置(logback.xml)中,让 pattern 包含
,例如:
务必在 filter 的
块中调用
,避免线程复用导致 traceId 泄漏
若涉及异步(如
或线程池),需手动透传 MDC 内容(可用
封装)
跨服务传递 traceId(HTTP 场景)
单体内部靠 MDC 就够了,但服务间调用必须通过请求头透传:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
下游服务从
读取并塞入 MDC
上游服务调用下游时(如用
),添加拦截器自动注入 header:
更规范的做法是遵循 B3 协议(
、
等),方便与 Sleuth/Zipkin 兼容
日志结构与排查建议
有 traceId 只是起点,真正好用的日志还需结构化和上下文:
关键节点打点:入口、出参、异常、远程调用前后,都记录 traceId + 方法名 + 耗时 + 关键参数/返回值(脱敏)
避免只打“开始处理”“结束处理”,应包含业务标识(如
),便于关联业务数据
异常日志必须
,否则堆栈丢失;同时补上 traceId 和业务 ID,方便快速定位
生产环境建议用 JSON 格式输出日志(如 LogstashEncoder),便于 ELK 收集和结构化查询
logging.pattern.level=%clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${spring.application.name:-},%X{traceId:-},%X{spanId:-}])traceparentUUID.randomUUID().toString().replace("-", "")MDC.put("traceId", id)%X{traceId}%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%nfinallyMDC.clear()CompletableFutureLogUtil.copyMdcToChildThread()HttpServletRequest.getHeader("X-Trace-ID")RestTemplaterequest.getHeaders().set("X-Trace-ID", MDC.get("traceId"))X-B3-TraceIdX-B3-SpanIdorderNo=ORD123456logger.error("xxx failed", e)