Skip to content

Instantly share code, notes, and snippets.

@vishalmamidi
Created January 10, 2022 19:20
Show Gist options
  • Select an option

  • Save vishalmamidi/999366b3415135e207607d4695a3c42f to your computer and use it in GitHub Desktop.

Select an option

Save vishalmamidi/999366b3415135e207607d4695a3c42f to your computer and use it in GitHub Desktop.
Spring boot request response logging, find issue
package com.x.x.x;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author vishal.mamidi
*
*/
@Order(1)
@Component
public class LoggerFilter implements Filter {
private final Logger LOGGER = LoggerFactory.getLogger(LoggerFilter.class);
private final String X_REQUEST_ID = "X-Request-ID";
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String responseStr = null;
try {
if (!"GET".equalsIgnoreCase(req.getMethod()))
MDC.put("RequestBody", request.getReader().lines().collect(Collectors.joining(System.lineSeparator())));
HttpHeaders httpHeaders = Collections
.list(req.getHeaderNames())
.stream()
.collect(Collectors.toMap(
Function.identity(),
h -> Collections.list(req.getHeaders(h)),
(oldValue, newValue) -> newValue,
HttpHeaders::new
));
MDC.put("Headers", String.valueOf(httpHeaders));
addXRequestId(req);
LOGGER.info("Type: Request - path: {}, method: {}, query: {}, host: {}",
req.getRequestURI(), req.getMethod(), req.getQueryString(), req.getRemoteHost());
res.setHeader(X_REQUEST_ID, MDC.get(X_REQUEST_ID));
ContentCachingResponseWrapper responseCacheWrapperObject = new ContentCachingResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseCacheWrapperObject);
byte[] responseArray = responseCacheWrapperObject.getContentAsByteArray();
responseStr = new String(responseArray, responseCacheWrapperObject.getCharacterEncoding());
responseCacheWrapperObject.copyBodyToResponse();
} finally {
MDC.remove("Headers");
MDC.remove("RequestBody");
MDC.put("ResponseBody", responseStr);
HttpHeaders httpHeaders = Collections
.synchronizedCollection(res.getHeaderNames())
.stream()
.collect(Collectors.toMap(
Function.identity(),
h -> Collections.list(req.getHeaders(h)),
(oldValue, newValue) -> newValue,
HttpHeaders::new
));
MDC.put("Headers", String.valueOf(httpHeaders));
LOGGER.info("Type: Response - statusCode: {}, path: {}, method: {}, query: {}",
res.getStatus(), req.getRequestURI(), req.getMethod(), req.getQueryString());
MDC.clear();
}
}
private void addXRequestId(HttpServletRequest request) {
String xRequestId = request.getHeader(X_REQUEST_ID);
if (xRequestId == null) {
MDC.put(X_REQUEST_ID, UUID.randomUUID().toString().replace("-",""));
} else {
MDC.put(X_REQUEST_ID, xRequestId);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment