how to log Spring 5 WebClient call

前端 未结 8 833
清酒与你
清酒与你 2020-11-29 03:13

I\'m trying to log a request using Spring 5 WebClient. Do you have any idea how could I achieve that?

(I\'m using Spring 5 and Spring boot 2)

The code looks

8条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-29 03:28

    You don't necessarily need to roll your own logger, reactor.ipc.netty.channel.ChannelOperationsHandler does it for you. Just configure your logging system for that class to log at DEBUG level:

    2017-11-23 12:52:04.562 DEBUG 41449 --- [ctor-http-nio-5] r.i.n.channel.ChannelOperationsHandler   : [id: 0x9183d6da, L:/127.0.0.1:57681 - R:localhost/127.0.0.1:8000] Writing object DefaultFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
    GET /api/v1/watch/namespaces/default/events HTTP/1.1
    user-agent: ReactorNetty/0.7.1.RELEASE
    host: localhost:8000
    accept-encoding: gzip
    Accept: application/json
    content-length: 0
    

    One way to have fewer bugs is to not write code whenever possible.

    Nov 2018:

    With spring-webflux:5.1.2.RELEASE, the above no longer works. Use the following instead:

    logging.level.org.springframework.web.reactive.function.client.ExchangeFunctions=DEBUG
    ...
    2018-11-06 20:58:58.181 DEBUG 20300 --- [           main] o.s.w.r.f.client.ExchangeFunctions       : [2026fbff] HTTP GET http://localhost:8080/stocks/search?symbol=AAPL
    2018-11-06 20:58:58.451 DEBUG 20300 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [2026fbff] Response 400 BAD_REQUEST
    

    To log headers or form body, set the above to TRACE level; however, that's not enough:

    ExchangeStrategies exchangeStrategies = ExchangeStrategies.withDefaults();
    exchangeStrategies
        .messageWriters().stream()
        .filter(LoggingCodecSupport.class::isInstance)
        .forEach(writer -> ((LoggingCodecSupport)writer).setEnableLoggingRequestDetails(true));
    
    client = WebClient.builder()
        .exchangeStrategies(exchangeStrategies)
    

    Mar 2019:

    In response to a question in the comment that asked how to log request and response body, I don’t know if Spring has such a logger but WebClient is built on Netty, so enabling debug logging for package reactor.ipc.netty should work, along with this answer.

提交回复
热议问题