Я использую 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 для запроса и ответов?