SLF4J 提供了 MDC(Mapped Diagnostic Contexts)功能,支持用户定义和修改日志的输出格式以及内容。本文将介绍 Tracer 集成的 SLF4J MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId 以及 SpanId 。
使用方式
在项目中引入如下的 Tracer 相关依赖:
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>tracer-core</artifactId> </dependency> <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>tracer-extensions</artifactId> </dependency>
修改已有的日志配置文件中的 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>
在 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
文档内容是否对您有帮助?