This tutorial shows how to trace incoming HTTP requests using CommonsRequestLoggingFilter.
There are several options to trace the incoming HTTP Requests of a Spring Boot 2.x application. One of the simplest option is to use the CommonsRequestLoggingFilter which can be added as a Bean in any configuration class. See the following example:
package com.example.testrest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CommonsRequestLoggingFilter; @Configuration public class RequestLoggerFilter { @Bean public CommonsRequestLoggingFilter logFilter() { CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); filter.setIncludeQueryString(true); filter.setIncludePayload(true); filter.setMaxPayloadLength(10000); filter.setIncludeHeaders(false); filter.setAfterMessagePrefix("REQUEST DATA : "); return filter; } }
You also need to set the logging level for CommonsRequestLoggingFilter in the application.properties file:
logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG
Or as an alternative, in logback.xml:
<?xml version="1.0" encoding="UTF-8"?><logger name="org.springframework.web.filter.CommonsRequestLoggingFilter"> <level value="DEBUG"/> </logger>
When added, you will be able to see the incoming request in your Spring Boot Console:
2020-04-09 15:53:06.554 DEBUG 13536 --- [nio-8080-exec-1] o.s.w.f.CommonsRequestLoggingFilter : Before request [uri=/list] 2020-04-09 15:53:06.630 DEBUG 13536 --- [nio-8080-exec-1] o.s.w.f.CommonsRequestLoggingFilter : REQUEST DATA : uri=/list]
On the other hand, if you want to receive the HTTP Request as a Stream, you can do that by extending the HandlerInterceptorAdapter class:
@Component public class CustomHandlerInterceptorAdapter extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { ServletRequest servletRequest = new ContentCachingRequestWrapper(request); servletRequest.getParameterMap(); // Read inputStream and log it return true; } }
Mind it, as you are dealing with InputStreams, you cannot read them twice!