TIP

本文将指导开发者如何在应用代码中集成获取 TraceID将 TraceID 添加到应用日志的方法,适合具有一定开发经验的后端开发人员。

业务日志与 TraceID 关联

目录

背景

  • 为了正确关联单次请求中自动发送的多个 span(单次请求调用的不同模块/节点/服务),服务的 HTTP 请求头中会携带 TraceID 及其他用于关联链路的信息。

  • Trace 表示单次请求的调用过程,TraceID 是标识该请求的唯一 ID。日志中带有 TraceID 后,可以将链路追踪与应用日志关联起来。

基于以上背景,本文将说明如何从 HTTP 请求头中获取 TraceID 并添加到应用日志中,方便您在平台上通过 TraceID 精准查询日志数据。

在 Java 应用日志中添加 TraceID

TIP
  • 以下示例基于 Spring Boot 框架,使用 Log4jLogback 进行说明。

  • 您的应用需满足以下前置条件:

    • 日志库类型及版本需满足以下要求:

      日志库版本要求
      Log4j 11.2+
      Log4j 22.7+
      Logback1.0+
    • 应用已注入 Java Agent。

方法一:配置 logging.pattern.level

在应用配置中修改 logging.pattern.level 参数如下:

logging.pattern.level = trace_id=%mdc{trace_id}

方法二:配置 CONSOLE_LOG_PATTERN

  1. 修改 logback 配置文件如下。

    TIP

    此处以控制台输出为例,%X{trace_id} 表示从 MDC 中获取 key 为 trace_id 的值。

    <property name="CONSOLE_LOG_PATTERN"
        value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [trace_id=%X{trace_id}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  2. 在需要输出日志的类中添加 @Slf4j 注解,并使用 log 对象输出日志,示例如下:

    @RestController
    @Slf4j
    public class ProviderController {
    
        @GetMapping("/hello")
        public String hello(HttpServletRequest request) {
            log.info("request /hello");
            return "hello world";
        }
    }

在 Python 应用日志中添加 TraceID

  1. 在应用代码中添加如下代码,从请求头中获取 TraceID。示例代码如下,可根据实际情况调整:

    TIP

    getForwardHeaders 函数从请求头中获取链路追踪信息,其中 x-b3-traceid 的值即为 TraceID。

       def getForwardHeaders(request):
           headers = {}
           incoming_headers = [
               'x-request-id',  # 所有应用均应传递 x-request-id,用于访问日志和一致的链路追踪/日志采样决策
               'x-b3-traceid',  # B3 链路头,兼容 Zipkin、OpenCensusAgent 和 Stackdriver 配置
               'x-b3-spanid',
               'x-b3-parentspanid',
               'x-b3-sampled',
               'x-b3-flags',
           ]
           for ihdr in incoming_headers:
               val = request.headers.get(ihdr)
               if val is not None:
                   headers[ihdr] = val
    
           return headers
  2. 在应用代码中添加如下代码,将获取到的 TraceID 添加到日志中。示例代码如下,可根据实际情况调整:

    headers = getForwardHeaders(request)
    tracing_section = ' [%(x-b3-traceid)s,%(x-b3-spanid)s] ' % headers
    logging.info(tracing_section + "Oops, unexpected error happens.")

验证方法

  1. 点击左侧导航栏的 Tracing

  2. 在查询条件中选择 TraceID,输入要查询的 TraceID,点击 Add to query

  3. 在下方展示的链路数据中,点击 TraceID 旁的 View Log

  4. Log Query 页面,勾选 Contain Trace ID,系统将只展示包含该 TraceID 的日志数据。