Skip to content

Commit d0fea75

Browse files
committed
Add WebClientLogger for enhanced logging of HTTP requests and responses #deploy-test-dolly-backend #deploy-dolly-backend
1 parent 8df7403 commit d0fea75

File tree

4 files changed

+87
-3
lines changed

4 files changed

+87
-3
lines changed

Diff for: apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import no.nav.dolly.config.Consumers;
99
import no.nav.dolly.metrics.Timed;
1010
import no.nav.testnav.libs.dto.inntektsmeldingservice.v1.requests.InntektsmeldingRequest;
11+
import no.nav.testnav.libs.reactivecore.logging.WebClientLogger;
1112
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
1213
import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange;
1314
import org.springframework.stereotype.Service;
@@ -30,12 +31,14 @@ public class InntektsmeldingConsumer extends ConsumerStatus {
3031
public InntektsmeldingConsumer(
3132
TokenExchange tokenService,
3233
Consumers consumers,
33-
WebClient webClient
34+
WebClient webClient,
35+
WebClientLogger webClientLogger
3436
) {
3537
this.tokenService = tokenService;
3638
serverProperties = consumers.getTestnavInntektsmeldingService();
37-
this.webClient = webClient
38-
.mutate()
39+
var webClientBuilder = webClient.mutate();
40+
webClientLogger.customize(webClientBuilder);
41+
this.webClient = webClientBuilder
3942
.baseUrl(serverProperties.getUrl())
4043
.build();
4144
}

Diff for: apps/dolly-backend/src/main/resources/logback-spring.xml

+1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@
4747
<logger level="TRACE" name="com.intellij.util.net.ssl"/>
4848
<logger level="ERROR" name="reactor.netty.transport.TransportConnector"/>
4949
<logger level="DEBUG" name="reactor.netty.http.client.HttpClient"/>
50+
<logger level="DEBUG" name="no.nav.dolly.bestilling.inntektsmelding.LoggingCustomizer"/>
5051
</configuration>

Diff for: libs/reactive-core/src/main/java/no/nav/testnav/libs/reactivecore/config/CoreConfig.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package no.nav.testnav.libs.reactivecore.config;
22

33
import no.nav.testnav.libs.reactivecore.filter.RequestLogger;
4+
import no.nav.testnav.libs.reactivecore.logging.WebClientLogger;
45
import org.springframework.context.annotation.Configuration;
56
import org.springframework.context.annotation.Import;
67

78
@Import({
89
RequestLogger.class,
10+
WebClientLogger.class,
911
ApplicationProperties.class
1012
})
1113
@Configuration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package no.nav.testnav.libs.reactivecore.logging;
2+
3+
import io.netty.channel.ChannelDuplexHandler;
4+
import io.netty.channel.ChannelHandlerContext;
5+
import io.netty.channel.ChannelPromise;
6+
import io.netty.handler.codec.http.FullHttpMessage;
7+
import io.netty.handler.codec.http.FullHttpRequest;
8+
import io.netty.handler.codec.http.FullHttpResponse;
9+
import io.netty.handler.codec.http.HttpContent;
10+
import io.netty.handler.codec.http.HttpRequest;
11+
import io.netty.handler.codec.http.HttpResponse;
12+
import io.netty.handler.codec.http.LastHttpContent;
13+
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.boot.web.reactive.function.client.WebClientCustomizer;
15+
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
16+
import org.springframework.stereotype.Component;
17+
import org.springframework.web.reactive.function.client.WebClient;
18+
import reactor.netty.http.client.HttpClient;
19+
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
import static java.nio.charset.Charset.defaultCharset;
24+
import static java.util.stream.Collectors.joining;
25+
26+
@Slf4j
27+
@Component
28+
public class WebClientLogger implements WebClientCustomizer {
29+
30+
@Override
31+
public void customize(WebClient.Builder webClientBuilder) {
32+
33+
var httpClient = HttpClient.create()
34+
.doOnRequest((httpClientRequest, connection) -> connection.addHandlerFirst(new LoggingHandler()));
35+
webClientBuilder.clientConnector(new ReactorClientHttpConnector(httpClient));
36+
}
37+
38+
private static class LoggingHandler extends ChannelDuplexHandler {
39+
40+
@Override
41+
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
42+
if (msg instanceof FullHttpRequest request) {
43+
log.debug("DOWNSTREAM REQUEST: METHOD: {}, URI: {}, BODY: {}, HEADERS: {}",
44+
request.method(), request.uri(), request.content().toString(defaultCharset()),
45+
tokenFilter(request.headers().entries()));
46+
} else if (msg instanceof HttpRequest request) {
47+
log.debug("DOWNSTREAM REQUEST: METHOD: {}, URI: {}, HEADERS: {}",
48+
request.method(), request.uri(), tokenFilter(request.headers().entries()));
49+
} else if (msg instanceof FullHttpMessage message) {
50+
log.debug("DOWNSTREAM REQUEST: BODY: {}",
51+
message.content().toString(defaultCharset()));
52+
}
53+
super.write(ctx, msg, promise);
54+
}
55+
56+
@Override
57+
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
58+
if (msg instanceof FullHttpResponse response) {
59+
log.debug("DOWNSTREAM RESPONSE: STATUS: {}, BODY: {}, HEADERS: {}",
60+
response.status().code(), response.content().toString(defaultCharset()), response.headers());
61+
} else if (msg instanceof HttpResponse response) {
62+
log.debug("DOWNSTREAM RESPONSE: STATUS: {}, HEADERS: {}",
63+
response.status().code(), response.headers());
64+
} else if (!(msg instanceof LastHttpContent) && msg instanceof HttpContent httpContent) {
65+
log.debug("DOWNSTREAM RESPONSE: BODY: {}",
66+
httpContent.content().toString(defaultCharset()));
67+
}
68+
super.channelRead(ctx, msg);
69+
}
70+
}
71+
72+
private static String tokenFilter(List<Map.Entry<String, String>> headers) {
73+
return headers.stream()
74+
.map(header -> header.getKey() + ": " +
75+
(header.getValue().startsWith("Bearer ") ? "Bearer ******" : header.getValue()))
76+
.collect(joining(", "));
77+
}
78+
}

0 commit comments

Comments
 (0)