Я хочу добавить заголовок запроса в журнал доступа. Итак, я попытался найти конфигурацию заголовка. Я нашел конфигурацию% header {header_name}, но она работает только в режиме logback-доступа. xml. Для журнала доступа к сети реактора не было конфигурации заголовка.
Затем я попытался использовать MD C с реактивным контекстом. В этом решении я добавил заголовок запроса в контексте реактора. Затем я использовал классы MdcContextLifter и MdcContextLifterConfiguration для обновления MD C всякий раз, когда запрос изменяет поток. Так что данные Md c всегда в правильном потоке. Но контекст каким-то образом становится пустым в середине обработки запроса.
Я добавил несколько журналов отладки и обнаружил, что после этого он становится пустым: [DEBUG] 2020-07-13 12: 46: 39.695 [Reaction-http- epoll-3] rnh c .HttpClientOperations
Как контекст реактора становится пустым? Есть ли способ избежать этого?
Есть ли другой способ добавить заголовок запроса в журнал доступа?
Таким образом я устанавливаю контекст реактора внутри настраиваемого фильтра.
return chain.filter(exchange.mutate().request(builder.build()).build()).
subscriberContext(Context.of("myRequestHeader",headerValue));
Вот MdcContextLifter и MdcContextLifterConfiguration.
public class MdcContextLifter implements CoreSubscriber {
private CoreSubscriber coreSubscriber;
public MdcContextLifter(CoreSubscriber coreSubscriber) {
this.coreSubscriber = coreSubscriber;
}
@Override
public void onNext(T t) {
System.out.println("In onNext");
copyToMdc(coreSubscriber.currentContext());
coreSubscriber.onNext(t);
}
@Override
public void onSubscribe(Subscription subscription) {
coreSubscriber.onSubscribe(subscription);
}
@Override
public void onComplete() {
coreSubscriber.onComplete();
}
@Override
public void onError(Throwable throwable) {
coreSubscriber.onError(throwable);
}
@Override
public Context currentContext() {
return coreSubscriber.currentContext();
}
private void copyToMdc(Context context) {
if (!context.isEmpty()) {
System.out.println("Context not empty : ");
Map<String, String> map = context.stream()
.collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString()));
map.forEach((k,v) -> System.out.println(k + " : " + v));
MDC.setContextMap(map);
} else {
System.out.println("Context is empty");
MDC.clear();
}
}
}
@configuration
public class MdcContextLifterConfiguration {
private static final String MDC_CONTEXT_REACTOR_KEY = MdcContextLifterConfiguration.class.getName();
@PostConstruct
public void contextOperatorHook(){
Hooks.onEachOperator(MDC_CONTEXT_REACTOR_KEY, Operators.lift((scannable, coreSubscriber) -> new MdcContextLifter<>(coreSubscriber)));
}
@PreDestroy
public void cleanupHook(){
Hooks.resetOnEachOperator(MDC_CONTEXT_REACTOR_KEY);
}
}