2.0.1 新特性介绍: 在日志中记录trace id

    java-chassis 使用 MDC 的方式记录 trace id, 可以在 log4j2 或者 logback 中打印 trace id。 java-chassis 记录 trace id 增加 了 Marker , 开发者可以方便的将这类日志进行分类输出。

    log4j2的配置如下:

    1. <Console name="Console" target="SYSTEM_OUT">
    2. <MarkerFilter marker="SERVICECOMB_MARKER" onMatch="DENY" onMismatch="ACCEPT"/>
    3. <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n"/>
    4. </Console>
    5. <Console name="Console-Tracing" target="SYSTEM_OUT">
    6. <MarkerFilter marker="SERVICECOMB_MARKER" onMismatch="DENY" onMatch="ACCEPT"/>
    7. <PatternLayout pattern="[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n"/>
    8. </Console>
    9. </Appenders>

    logback的配置如下:

    1. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    2. <encoder>
    3. <pattern>%d [%level] [%thread][%X{SERVICECOMB_TRACE_ID}] - %msg (%F:%L\)%n</pattern>
    4. </appender>

    结合 Marker, 可以将日志分类显示:

    业务日志包含 trace id

    • 记录 access log
    1. private static final Logger LOGGER
    2. = LoggerFactory.getLogger(AccessLogHandler.class);
    3. @Override
    4. public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
    5. invocation.getTraceIdLogger().info(LOGGER, "request for operation {} begin", invocation.getInvocationQualifiedName());
    6. invocation.next((resp) -> {
    7. invocation.getTraceIdLogger().info(LOGGER, "request for operation {} end", invocation.getInvocationQualifiedName());
    8. asyncResp.complete(resp);
    9. });
    10. }
    11. }

    配置 Handler

    1. <handler id="custom-access-log"
    2. </config>

    启用 Handler

    • 业务日志
    1. public class RegisterUrlPrefixEndpoint {
    2. private static final Logger LOGGER
    3. = LoggerFactory.getLogger(RegisterUrlPrefixEndpoint.class);
    4. @GetMapping(path = "/getName")
    5. public String getName(@RequestParam(name = "name") String name) {
    6. ((Invocation) ContextUtils.getInvocationContext()).getTraceIdLogger().info(LOGGER, "get name invoked.");
    7. return name;
    8. }
    9. }

    增加了 access log 和业务日志后的效果如下:

    1. [5e72e39e55209533-1] - request for operation PRODUCER rest demo-register-url-prefix-server.RegisterUrlPrefixEndpoint.getName begin
    2. [5e72e39e55209533-1] - request for operation PRODUCER rest demo-register-url-prefix-server.RegisterUrlPrefixEndpoint.getName end