Я работаю над настраиваемым стартером с пружинной загрузкой, чтобы обеспечить автоматическую настройку для всех приложений с пружинной загрузкой, которые есть в нашей распределенной системе, поэтому каждый раз, когда необходимо изменить конфигурацию, может быть сделано в одном месте, вместо того, чтобы проходить через все разные приложения, применяющие изменения, вместо этого достаточно просто обновления версии зависимости.
У меня есть собственные запросчики запросов и ответов для выборки URI запроса и статуса ответа и используя GenericFilterBean, я перехватываю http-запросы и заполняю значения в MD C, чтобы он был доступен во время регистрации, это хорошо работает с интеграционным тестом самого модуля, однако контекст MD C недоступен, когда этот модуль включен в виде библиотеки в другие службы.
Мои пользовательские шаблоны HttpResolvers, GenericFilterBean и log приведены ниже
public interface HttpRequestResolver {
String resolve(HttpServletRequest request);
String name();
default int order() {
return -1;
}
}
public class Resolvers {
public static HttpRequestResolver uriResolver() {
return new HttpRequestResolver() {
@Override
public String resolve(HttpServletRequest request) {
return StringUtils.defaultString(request.getRequestURI(), "n/a");
}
@Override
public String name() {
return "uri";
}
};
}
public static HttpResponseResolver status() {
return new HttpResponseResolver() {
@Override
public String resolve(HttpServletResponse response) {
return StringUtils.defaultString(String.valueOf(response.getStatus()), "-1");
}
@Override
public String name() {
return "status";
}
};
}
}
GenericFilterBean:
@Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1)
public class MyTraceLoggingFilter extends GenericFilterBean {
private static final Logger plog = LoggerFactory.getLogger("PERF");
private final List<HttpRequestResolver> requestResolvers;
private final List<HttpResponseResolver> responseResolvers;
@Value("${spring.application.name}")
private String appName;
public MyTraceLoggingFilter (
List<HttpRequestResolver> requestResolvers, List<HttpResponseResolver> responseResolvers) {
this.requestResolvers = requestResolvers;
this.responseResolvers = responseResolvers;
}
@Override
public void doFilter(
ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
long start = System.currentTimeMillis();
try {
requestResolvers
.stream()
.forEach(r -> MDC.put(r.name(), r.resolve((HttpServletRequest) servletRequest)));
filterChain.doFilter(servletRequest, servletResponse);
} finally {
responseResolvers.forEach(
r -> MDC.put(r.name(), r.resolve((HttpServletResponse) servletResponse)));
long elapsed = System.currentTimeMillis() - start;
MDC.put("rt", elapsed + "ms");
MDC.put("appName", appName);
plog.info(".");
}
}
}
logback-spring. xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="PERF_LOG_PATTERN"
value="%clr(appName:%X{appName:-n/a}) %clr(time:%d{yyyy-MM-ddHH:mm:ss.SSS}) %clr(traceId:%X{X-B3-TraceId:-n/a}) %clr(spanId:%X{X-B3-SpanId:-n/a}) %clr(parentSpanId:%X{X-B3-ParentSpanId:-n/a}) %clr(uri:%X{uri:-n/a}) %clr(rt:%X{rt:-n/a}) %clr(status:%X{status:-n/a})"/>
<!-- Appender to log to console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- Minimum logging level to be presented in the console logs-->
<level>INFO</level>
</filter>
<encoder>
<pattern>${PERF_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<logger name="PERF" level="INFO">
<appender-ref ref="console"/>
</logger>
</configuration>
Итак, когда модуль включен в другой сервис, тогда он печатает только **INFO PERF-.**
Может кто-нибудь предложить, пожалуйста, какой еще конфиг я должен включить, чтобы это работало. Заранее спасибо.