- 微服务系统日志使用ELK采集.
- 但单个请求会跨多个系统,mq等, 此时需要一个链路traceId, 能够一次查询还原出整一个请求的完整路径日志.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date %5level %6relative --- [%15thread] %-40logger{40} [trace:%X{traceId}] : %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.logs}/root.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] [trace:%X{traceId}] %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>root-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
/**
* trace链路常量
*/
public class TraceConstant {
public static final String TRACE_ID = "traceId";
public static final String SPAN_ID = "spanId";
}
/**
*统一请求注入traceId
**/
@Component
public class TraceApplicationInterceptor implements HandlerInterceptor {
@Override
@SuppressWarnings("all")
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceId = request.getHeader(TraceConstant.TRACE_ID);
if (StringUtil.isBlank(traceId)) {
traceId = UUID.randomUUID().toString();
}
MDC.put(TraceConstant.TRACE_ID, traceId);
PageHelper.clearPage();
return true;
}
}