Java实现接口调用链日志的核心是通过统一traceId串联多服务请求,推荐Spring Cloud Sleuth+Zipkin方案自动注入traceId/spanId到MDC并支持可视化;单体可自定义Filter+MDC实现,需注意异步透传与HTTP头传递(如X-Trace-ID或B3协议),日志应结构化、含业务标识且异常保留堆栈。
Java中实现接口调用链日志,核心是把一次请求在多个服务(或模块)间的流转过程串联起来,形成可追溯的完整链路。关键在于统一传递和维护一个全局唯一的追踪ID(如 traceId),并在每个日志输出中自动携带它。
这是目前最主流、开箱即用的分布式链路追踪方案:
logging.pattern.level=%clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${spring.application.name:-},%X{traceId:-},%X{spanId:-}]),日志行就会自动带上 traceId 和 spanIdtraceparent)不依赖外部组件,用几行代码即可实现基础链路标识:
UUID.randomUUID().toString().replace("-", "")),存入 MDC.put("traceId", id)
%X{traceId},例如:%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n
finally 块中调用 MDC.clear(),避免线程复用导致 traceId 泄漏CompletableFuture 或线程池),需手动透传 MDC 内容(可用 LogUtil.copyMdcToChildThread() 封装)单体内部靠 MDC 就够了,但服务间调用必须通过请求头透传:
HttpServletRequest.getHeader("X-Trace-ID") 读取并塞入 MDCRestTemplate),添加拦截器自动注入 header:request.getHeaders().set("X-Trace-ID", MDC.get("traceId"))
X-B3-TraceId、X-B3-SpanId 等),方便与 Sleuth/Zipkin 兼容有 traceId 只是起点,真正好用的日志还需结构化和上下文:
orderNo=ORD123456),便于关联业务数据logger.error("xxx failed", e),否则堆栈丢失;同时补上 traceId 和业务 ID,方便快速定位