你说的第一点怎么java代码实现
时间: 2024-04-05 22:34:38 浏览: 16
使用InheritableThreadLocal来传递MDC的上下文信息,可以按照以下步骤实现:
1. 在请求进来时生成traceid,并将其放入MDC中
```
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import java.util.UUID;
public class TraceInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(TraceInterceptor.class);
private static final InheritableThreadLocal<String> traceIdThreadLocal = new InheritableThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceid = UUID.randomUUID().toString();
traceIdThreadLocal.set(traceid);
MDC.put("traceid", traceid);
logger.info("TraceInterceptor preHandle, traceid={}", traceid);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
MDC.remove("traceid");
traceIdThreadLocal.remove();
}
}
```
在上述示例代码中,我们使用了一个InheritableThreadLocal来存储traceid,并在请求进来时将其放入MDC中。这样,即使在使用线程池时,子线程也可以继承父线程的traceid,并正确地写入日志中。
2. 在logback配置文件中使用`${mdcKey}`占位符来引用traceid
```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceid}] %-5level %logger{36} - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.example" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
```
在以上的logback配置中,我们可以使用`${mdcKey}`占位符来引用traceid,例如:`[%X{traceid}]`。
这样,在日志中就可以看到类似于`[1a2b3c4d-5e6f-7g8h-9i10j11k12l]`这样的traceid了。同时,由于使用了InheritableThreadLocal来存储traceid,即使在使用线程池时,子线程也可以继承父线程的traceid,并正确地写入日志中。