Как добавить заголовок запроса в журнал доступа весеннего облачного шлюза? - PullRequest
0 голосов
/ 13 июля 2020

Я хочу добавить заголовок запроса в журнал доступа. Итак, я попытался найти конфигурацию заголовка. Я нашел конфигурацию% 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);
}
}
...