TIP

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

与 TraceID 相关的业务日志

背景

  • 为了正确地将多个自动发送的跨度(在单个请求中调用的不同模块/节点/服务)关联到一个跟踪中,服务的 HTTP 请求头中将包括 TraceID 和其他用于关联跟踪的信息。

  • 一个跟踪表示单个请求的调用过程,TraceID 是标识该请求的唯一 ID。在日志中包含 TraceID 后,跟踪信息可以与应用日志进行关联。

基于上述背景,本文将解释如何从 HTTP 请求头中获取 TraceID 并将其添加到应用日志中,使您能够使用 TraceID 准确查询平台上的日志数据。

将 TraceID 添加到 Java 应用日志

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

  • 您的应用程序必须满足以下先决条件:

    • 日志库的类型和版本必须满足以下要求:

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

方法1:配置 logging.pattern.level

修改您的应用程序配置中的 logging.pattern.level 参数,如下所示:

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

方法2:配置 CONSOLE_LOG_PATTERN

  1. 修改 logback 配置文件,如下所示:

    TIP

    此处以控制台输出为例,其中 %X{trace_id} 表示从 MDC 中检索到的键 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 注解并使用日志对象输出日志,如下所示:

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

将 TraceID 添加到 Python 应用日志

  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 的日志数据。