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:
<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!