全部产品
云市场

集成 SLF4J MDC 功能

更新时间:2019-11-06 15:04:56

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

使用方式

  1. 保证项目中已经引入如下的 Tracer 相关依赖:

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

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

      1. <?xml version="1.0" encoding="UTF-8"?> <configuration>
      2. <Appenders>
      3. <Console name="CONSOLE" target="SYSTEM_OUT">
      4. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{SOFA-TraceId},%X{SOFA-SpanId}] ---- %m%n " />
      5. </Console>
      6. <File name="File" fileName="./logs/test.log">
      7. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{SOFA-TraceId},%X{SOFA-SpanId}] ---- %m%n " />
      8. </File>
      9. </Appenders>
      10. <Loggers>
      11. <root level="info">
      12. <AppenderRef ref="CONSOLE" />
      13. <AppenderRef ref="File" />
      14. </root>
      15. </Loggers>
      16. </configuration>
  3. 在 PatternLayout 中增加 %X{SOFA-TraceId}%X{SOFA-SpanId} 配置:
    • %X{SOFA-TraceId}:对应 TraceId,实际运行时将会被替换为当前 Tracer 上下文的 TraceId,如果当前不存在 Tracer 上下文,则会被替换为空字符串。
    • %X{SOFA-SpanId}:对应 SpanId,实际运行时将会被替换为当前 Tracer 上下文的 SpanId,如果当前不存在 Tracer 上下文,则会被替换为空字符串。

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

  1. logger.info("rest mdc example");

实际输出的日志如下:

  1. 2018-02-05 15:52:45.037 [SOFA-REST-WORK-3-1] INFO 0a0fe86f151781716496210012303 0 MDC-EXAMPLE - rest mdc example