Java日志串联追踪API的设计思路

基于MDC功能进行日志Tag追踪的API

https://github.com/kevinten10/vrml/

问题背景

在项目中,经常需要通过日志的Tag等方式,将日志进行串联追踪。

如果在代码中手动的去打印Tag值,会造成每打印一次Tag都需要一次编码,同时方法还需要持有Tag的值对象。

一种解决方案是直接使用MDC,通过线程上下文来传递Tag的值对象,同时避免了在代码中手工的打印Tag。

Trace模块对MDC的方式进行了简单的封装,相较于直接使用MDC,语义更加清晰。

解决思路

封装MDC的API,对外提供一层语义更加明确的访问接口

用例演示

TraceAPI可以使用MdcTraces管理MDC,从而基于MDC进行日志的Tag管理。

// 初始化MDC的值
  MdcTraces.useThreadLocal().initMdc("key","value");
  
  // 向MDC中增加数值
  MdcTraces.useThreadLocal().put("key", "value");

  // 从MDC中移除数值
  MdcTraces.useThreadLocal().remove("key");

  // 清空当前线程的MDC
  MdcTraces.useThreadLocal().clearMdc();

举例:使用MDC TraceAPI记录日志的Tag

try {
      // initialize global log tag at beginning
      MdcTraces.useThreadLocal().initMdc("messageId", "messageId");

      {
          // put local log tag
          MdcTraces.useThreadLocal().put("local", "value");
          {
              // your logic
              yourLogic();
          }
          // remove local log tag
          MdcTraces.useThreadLocal().remove("local");
      }
  } finally {
      // clear the threadLocal log tags
      MdcTraces.useThreadLocal().clearMdc();
  }

如果有必要,记得在配置文件中配置Tag的打印格式,例如 %X{messageId}%X{local}

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 1. use slf4j log appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}] - %X{messageId}%X{local}%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

Maven

<dependency>
  <groupId>com.kevinten</groupId>
  <artifactId>vrml-trace</artifactId>
  <version>1.0.0</version>
</dependency>
全部评论

相关推荐

点赞 评论 收藏
分享
牛客976315581号:这是hr“不合适”的便捷语句
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务