Сохраняйте контекст журнала при регистрации ответов с помощью Spring WebClient - PullRequest
0 голосов
/ 01 марта 2020

Я использую Spring WebClient в своем API даже для синхронных вызовов, поскольку RestTemplate скоро будет объявлен устаревшим.

Когда мой API получает какие-либо HTTP-вызовы, я регистрирую полученный заголовок идентификатора запроса, который собирается быть использованным во всех моих журналах. Что-то вроде следующего кода:

@Component
class HeadersFilter : GenericFilterBean() {
    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
        val header = request.getHeader("X-Request-ID")
        MDC.put("request-id", header)

        chain.doFilter(request, response)
    }
}

При использовании WebClient я также создал фильтры для регистрации всех запросов и ответов, выполнив следующие действия:

// ommited code
        WebClient.builder()
            .baseUrl(baseUrl)
            .filter(logRequest(logger))
            .filter(logResponse(logger))
            .exchangeStrategies(exchangeStrategies)
            .build()
// ommited code

fun logRequest(logger: Logger): ExchangeFilterFunction {
    return ExchangeFilterFunction.ofRequestProcessor { clientRequest ->
        val headers = clientRequest.headers().map { "${it.key}=${it.value.joinToString(",")}" }

        logger.info(
            "OUTBOUND_REQUEST - method={} url={} headers={}",
            clientRequest.method(),
            clientRequest.url(),
            headers
        )

        Mono.just(clientRequest)
    }
}

fun logResponse(logger: Logger): ExchangeFilterFunction {
    return ExchangeFilterFunction.ofResponseProcessor { clientResponse ->
        logger.info("OUTBOUND_RESPONSE - url={} status={}", clientResponse.statusCode())

        Mono.just(clientResponse)
    }
}

Но когда я проверяю в моих журналах, по-видимому, только запросы имеют идентификатор запроса, для всех ответов это поле пустое, и я понятия не имею, почему.

{"log_level": "INFO ", "request_id": "e7384d81-f91d-476e-b2c5-e887fec76ad9,bb0b8b53-d408-497d-b72e-9d8d74a3edbf", "content": OUTBOUND_REQUEST - method=POST url=url headers=[header1=value1]}

{"log_level": "INFO ", "request_id": "", "content": OUTBOUND_RESPONSE - status=201 CREATED}

Как я могу зарегистрировать request_id для запроса и ответов?

...