Apache ServiceComb Java Chassis 2.0.1 新特性重磅出擊: 在日誌中記錄trace id

點擊上方藍色字體,關注我們

微服務架構下,需要部署大量的微服務實例,調用情況複雜,給問題定位帶來了很大的麻煩。通過調用鏈系統能夠很好的解決日誌追蹤的問題, 但是對於日常的開發調試,部署調用鏈仍然顯得複雜。java-chassis 提供了一種簡單的機制,允許業務在記錄日誌的時候,包含trace id。

1

在日誌系統中記錄 trace id

java-chassis 使用 MDC 的方式記錄 trace id, 可以在 log4j2 或者 logback 中打印 trace id。java-chassis 記錄 trace id 增加 了 Marker , 開發者可以方便的將這類日誌進行分類輸出。

log4j2的配置如下:

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n"/>
    </Console>
  </Appenders>

結合 Marker, 將日誌分類顯示:

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <MarkerFilter marker="SERVICECOMB_MARKER" onMatch="DENY" onMismatch="ACCEPT"/>
      <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n"/>
    </Console>
    <Console name="Console-Tracing" target="SYSTEM_OUT">
      <MarkerFilter marker="SERVICECOMB_MARKER" onMismatch="DENY" onMatch="ACCEPT"/>
      <PatternLayout pattern="[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n"/>
    </Console>
  </Appenders>

logback的配置如下:

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

結合 Marker, 可以將日誌分類顯示:

  <appender name="STDOUT-TRACING" class="ch.qos.logback.core.ConsoleAppender">
    
    <filter class="org.apache.servicecomb.foundation.logback.MarkerFilter">
      <Marker>SERVICECOMB_MARKER</Marker>
      <OnMismatch>DENY</OnMismatch>
      <OnMatch>ACCEPT</OnMatch>
    </filter>

    <encoder>
      <pattern>%d [%level] [%thread][%X{SERVICECOMB_TRACE_ID}] - %msg (%F:%L\)%n</pattern>
    </encoder>
  </appender>


2

業務日誌包含 trace id

  • 記錄 access log

java-chassis 只有少量的日誌包含 trace id,業務可以方便的在自己記錄的日誌中包含 trace id。下面開發一個簡單的 Handler, 記錄服務端的 access log。

public class AccessLogHandler implements Handler {  private static final Logger LOGGER
      = LoggerFactory.getLogger(AccessLogHandler.class);  @Override
  public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
    invocation.getTraceIdLogger().info(LOGGER, "request for operation {} begin", invocation.getInvocationQualifiedName());
     invocation.next((resp) -> {
       invocation.getTraceIdLogger().info(LOGGER, "request for operation {} end", invocation.getInvocationQualifiedName());
       asyncResp.complete(resp);
     });
  }
}

配置 Handler

<config>
  <handler id="custom-access-log"
    class="org.apache.servicecomb.demo.prefix.AccessLogHandler"/></config>

啓用 Handler

servicecomb:  handler:    chain:
      Provider:        default: custom-access-log
  • 業務日誌

可以在業務實現中記錄 trace id

public class RegisterUrlPrefixEndpoint {  private static final Logger LOGGER
      = LoggerFactory.getLogger(RegisterUrlPrefixEndpoint.class);  @GetMapping(path = "/getName")  public String getName(@RequestParam(name = "name") String name) {
    ((Invocation) ContextUtils.getInvocationContext()).getTraceIdLogger().info(LOGGER, "get name invoked.");    return name;
  }
}

增加了 access log 和業務日誌後的效果如下:

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

-----

-----

如您對開源開發、微服務感興趣

歡迎掃描下方二維碼添加

ServiceComb小助手

咱們一起做點有意思的事情~

加小助手不迷路

進羣論英雄

加入我們吧!

在看一點 bug退散

點擊下方“閱讀原文”查看更多ServiceComb小知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章