Skip to content

Instantly share code, notes, and snippets.

@yusufcakal
Last active February 8, 2021 08:01
Show Gist options
  • Select an option

  • Save yusufcakal/c593d8d92619559675ee90b38f932459 to your computer and use it in GitHub Desktop.

Select an option

Save yusufcakal/c593d8d92619559675ee90b38f932459 to your computer and use it in GitHub Desktop.

Revisions

  1. yusufcakal revised this gist Feb 8, 2021. 1 changed file with 77 additions and 6 deletions.
    83 changes: 77 additions & 6 deletions LoggingFilter.java
    Original file line number Diff line number Diff line change
    @@ -1,8 +1,57 @@
    import com.dolap.settlement.model.request.CreateSettlementRequest;
    import com.dolap.settlement.model.response.GetSettlementResponse;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.lang3.tuple.ImmutablePair;
    import org.apache.logging.log4j.util.Strings;
    import org.slf4j.MDC;
    import org.springframework.core.ParameterizedTypeReference;
    import org.springframework.http.HttpMethod;
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    import org.springframework.web.util.ContentCachingRequestWrapper;
    import org.springframework.web.util.ContentCachingResponseWrapper;

    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.Type;
    import java.nio.charset.StandardCharsets;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;

    @Component
    public class LoggingFilter extends OncePerRequestFilter {

    private static final Map<String, HttpMethod> EXCLUDED_LOGGING_ENDPOINT = new HashMap<>() {{
    put("/actuator/health", HttpMethod.GET);
    }};

    private static final Map<String, Map.Entry<HttpMethod, Object>> MASKABLE_DATA_OF_REQUEST_ENDPOINTS = new HashMap<>() {{
    put("/settlement/create", new ImmutablePair<>(HttpMethod.POST, CreateSettlementRequest.class));
    }};

    private static final Map<String, Map.Entry<HttpMethod, Object>> MASKABLE_DATA_OF_RESPONSE_ENDPOINTS = new HashMap<>() {{
    put("/settlement/", new ImmutablePair<>(HttpMethod.GET, GetSettlementResponse.class));
    }};

    private final ObjectMapper objectMapper;

    public LoggingFilter(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    for (String uri : EXCLUDED_LOGGING_ENDPOINT.keySet()) {
    if (uri.equals(request.getRequestURI()) && EXCLUDED_LOGGING_ENDPOINT.get(uri).toString().equals(request.getMethod())) {
    return;
    }
    }

    MDC.put("requestId", "Correlation ID: " + UUID.randomUUID().toString());

    String method = request.getMethod();
    @@ -14,18 +63,40 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
    filterChain.doFilter(wrappedRequest, wrappedResponse);

    String requestBody = getContentAsString(wrappedRequest.getContentAsByteArray());
    String responseBody = getContentAsString(wrappedResponse.getContentAsByteArray());

    if (requestBody.length() > 0) {
    this.logger.info("Request: " + method + " - " + endpoint + "\n" + requestBody);
    for (String url : MASKABLE_DATA_OF_REQUEST_ENDPOINTS.keySet()) {
    if (request.getRequestURI().equals(url) && request.getMethod().equals(MASKABLE_DATA_OF_REQUEST_ENDPOINTS.get(url).getKey().toString())) {
    Object object = MASKABLE_DATA_OF_REQUEST_ENDPOINTS.get(url).getValue();
    Object o = objectMapper.readValue(requestBody, convertToTypeReference(ParameterizedTypeReference.forType((Type) object)));
    logger.info("Request: " + method + " - " + endpoint + "\n" + o.toString());
    } else {
    logger.info("Request: " + method + " - " + endpoint + "\n" + requestBody);
    }
    }

    String responseBody = getContentAsString(wrappedResponse.getContentAsByteArray());
    this.logger.info("Response: \n" + responseBody);
    for (String url : MASKABLE_DATA_OF_RESPONSE_ENDPOINTS.keySet()) {
    if (request.getRequestURI().equals(url) && request.getMethod().equals(MASKABLE_DATA_OF_RESPONSE_ENDPOINTS.get(url).getKey().toString())) {
    Object object = MASKABLE_DATA_OF_RESPONSE_ENDPOINTS.get(url).getValue();
    Object o = objectMapper.readValue(responseBody, convertToTypeReference(ParameterizedTypeReference.forType((Type) object)));
    logger.info("Response: " + "\n" + o.toString());
    } else {
    logger.info("Response: " + "\n" + responseBody);
    }
    }

    wrappedResponse.copyBodyToResponse();
    }

    private String getContentAsString(byte[] bytes) {
    return (bytes != null && bytes.length > 0) ? new String(bytes, 0, bytes.length, StandardCharsets.UTF_8) : Strings.EMPTY;
    }
    }

    private <T> TypeReference<T> convertToTypeReference(ParameterizedTypeReference<T> parameterizedTypeReference) {
    return new TypeReference<T>() {
    public Type getType() {
    return parameterizedTypeReference.getType();
    }
    };
    }
    }
  2. yusufcakal revised this gist Jan 22, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion LoggingFilter.java
    Original file line number Diff line number Diff line change
    @@ -3,7 +3,7 @@ public class LoggingFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    MDC.put("requestId", "Request ID: " + UUID.randomUUID().toString());
    MDC.put("requestId", "Correlation ID: " + UUID.randomUUID().toString());

    String method = request.getMethod();
    String endpoint = request.getRequestURL().toString();
  3. yusufcakal revised this gist Jan 22, 2021. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions application.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,3 @@
    logging:
    pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %clr([%thread]){magenta} %yellow([%X{requestId}]) %highlight(%-5level) %cyan(%-40.40logger{40}) - %msg %n"
  4. yusufcakal created this gist Jan 22, 2021.
    31 changes: 31 additions & 0 deletions LoggingFilter.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    @Component
    public class LoggingFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    MDC.put("requestId", "Request ID: " + UUID.randomUUID().toString());

    String method = request.getMethod();
    String endpoint = request.getRequestURL().toString();

    ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
    ContentCachingResponseWrapper wrappedResponse = new ContentCachingResponseWrapper(response);

    filterChain.doFilter(wrappedRequest, wrappedResponse);

    String requestBody = getContentAsString(wrappedRequest.getContentAsByteArray());

    if (requestBody.length() > 0) {
    this.logger.info("Request: " + method + " - " + endpoint + "\n" + requestBody);
    }

    String responseBody = getContentAsString(wrappedResponse.getContentAsByteArray());
    this.logger.info("Response: \n" + responseBody);

    wrappedResponse.copyBodyToResponse();
    }

    private String getContentAsString(byte[] bytes) {
    return (bytes != null && bytes.length > 0) ? new String(bytes, 0, bytes.length, StandardCharsets.UTF_8) : Strings.EMPTY;
    }
    }