- Вам необходимо настроить приложение Spring для использования журнала. xml файл для ведения журнала.
- Создайте перехватчик, который будет устанавливать дополнительные контексты MD C, как это делает Сыщик.
- Вам необходимо передать те же дополнительные контексты MD C другим службам в заголовках HTTP.
Конфигурация входа в систему
<configuration>
<appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
<encoder>
<pattern>[%date{dd-MM-yyyy HH:mm:ss.SSS}] [%thread] %-5level %X{traceId:-} %X{spanId:-} ${PID:-} %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE">
<encoder>
<pattern>[%date{dd-MM-yyyy HH:mm:ss.SSS}] [%thread] %-5level %X{traceId:-} %X{spanId:-} ${PID:-} %logger{36} - %msg%n</pattern>
</encoder>
<file>log/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log/app.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>200MB</totalSizeCap>
</rollingPolicy>
</appender>
<logger level="INFO" name="root">
<appender-ref ref="STDOUT"/>
</logger>
</configuration>
Перехватчик, который устанавливает MD C контекст для трассировки.
@Slf4j
public class LoggerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String traceId = request.getHeader("TRACE_ID");
String spanId = request.getHeader("SPAN_ID");
if (traceId == null) {
traceId = UUID.randomUUID().toString();
}
// You can generate new spanId or use the same one
if (spanId == null) {
spanId = UUID.randomUUID().toString();
}
MDC.put("TRACE_ID", traceId);
MDC.put("traceId", traceId);
MDC.put("SPAN_ID", spanId);
MDC.put("spanId", spanId);
log.info("[preHandle] HTTP: {}, URL: {} ", request.getMethod(), request.getRequestURI());
return true;
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
throws Exception {
log.info("[postHandle] HTTP: {}, URL: {} ", request.getMethod(), request.getRequestURI());
MDC.clear();
}
}
Если вы хотите измерить время выполнения, тогда добавьте профилировщик для того же. Подробнее об этом читайте в примере Профилирование Spring Boot , там указано c о загрузке Spring, но вы можете использовать тот же подход и в приложении Spring.
Если вы ' Если вы используете RestTemplate, вы можете установить эти заголовки.
HttpHeaders headers = new HttpHeaders();
headers.set("TRACE_ID", MDC.get("TRACE_ID"));
headers.set("SPAN_ID", MDC.get("SPAN_ID"));
HttpEntity entity = new HttpEntity(headers);
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory rf =
(SimpleClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(2 * Constants.ONE_MILLI_INT);
rf.setConnectTimeout(2 * Constants.ONE_MILLI_INT);
ResponseEntity<String> response =
restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
В этом простом примере были установлены заголовки TRACE_ID
и SPAN_ID
.