全部产品

集成 SLF4J MDC 功能

SLF4J 提供了 MDC(Mapped Diagnostic Contexts)功能,支持用户定义和修改日志的输出格式以及内容。本文将介绍 Tracer 集成的 SLF4J MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId 以及 SpanId 。

使用方式

  1. 在项目中引入如下的 Tracer 相关依赖:

    <dependency>
         <groupId>com.alipay.sofa</groupId>
         <artifactId>tracer-core</artifactId>
    </dependency>
    
    <dependency>
          <groupId>com.alipay.sofa</groupId>
          <artifactId>tracer-extensions</artifactId>
    </dependency>
  2. 修改已有的日志配置文件中的 PatternLayout 属性:

    • logback 示例

      <!-- 此为 Tracer MDC 功能展示范例 appender,实际使用时可删除 -->
      <appender name="MDC-EXAMPLE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <append>true</append>
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
              <level>${logging.level}</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
          <file>${logging.path}/archtype-test-client/mdc-example.log</file>
          <!-- to generate a log file everyday with a longest lasting of 30 days -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <!-- logfile name with daily rolling-->
                  <FileNamePattern>${logging.path}/archtype-test-client/mdc-example.log.%d{yyyy-MM-dd}</FileNamePattern>
              <!-- log perserve days-->
              <MaxHistory>30</MaxHistory>
          </rollingPolicy>
          <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
              <!--output format:%d is for date,%thread is for thread name,%-5level:loglevel with 5 character  %msg:log message,%n line breaker-->
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %X{SOFA-TraceId} %X{SOFA-SpanId}  %logger{50} - %msg%n</pattern>
              <!-- encoding -->
              <charset>UTF-8</charset>
          </encoder>
      </appender>
      
    • log4j2 示例

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <Appenders>
              <Console name="CONSOLE" target="SYSTEM_OUT">
                  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{SOFA-TraceId},%X{SOFA-SpanId}] ---- %m%n "/>
              </Console>
              
              <Filename="File"fileName="./logs/test.log">
                  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{SOFA-TraceId},%X{SOFA-SpanId}] ---- %m%n "/>
              </File>
          </Appenders>
          <Loggers>
              <root level="info">
                  <Appender Refref="CONSOLE"/>
                  <Appender Refref="File"/>
              </root>
          </Loggers>
      </configuration>
  3. 在 PatternLayout 中增加 %X{SOFA-TraceId}%X{SOFA-SpanId} 配置:

    • %X{SOFA-TraceId}:对应 TraceId,实际运行时将会被替换为当前 Tracer 上下文的 TraceId,如果当前不存在 Tracer 上下文,则会被替换为空字符串。

    • %X{SOFA-SpanId}:对应 SpanId,实际运行时将会被替换为当前 Tracer 上下文的 SpanId,如果当前不存在 Tracer 上下文,则会被替换为空字符串。

在业务代码中,可通过如下命令正常打印日志,不需要额外修改:

logger.info("rest mdc example");

实际输出的日志如下:

2018-02-0515:52:45.037[SOFA-REST-WORK-3-1] INFO  0a0fe86f1517817164962100123030  MDC-EXAMPLE - rest mdc example