From dc89f17761e40b2a1e1c1effa17c4b0ea6f046cd Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Wed, 1 Oct 2025 14:45:07 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3215 Added reqParams to HttpLoggingFilter --- .../rest/filters/HttpLoggingFilter.java | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java index aae7ecb..2fa0db6 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java @@ -4,6 +4,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -13,7 +14,6 @@ import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -29,12 +29,12 @@ public class HttpLoggingFilter extends OncePerRequestFilter { protected boolean shouldNotFilter(HttpServletRequest request) { String path = request.getRequestURI(); return path.startsWith("/actuator/health") || path.startsWith("/swagger") - || path.startsWith("/v3/api-docs") || path.startsWith("/static/"); + || path.startsWith("/v3/api-docs") || path.startsWith("/static/") || path.equals("/"); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { + throws ServletException, IOException { long startNs = System.nanoTime(); @@ -42,8 +42,8 @@ public class HttpLoggingFilter extends OncePerRequestFilter { ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response); String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id")) - .filter(StringUtils::hasText) - .orElse(UUID.randomUUID().toString()); + .filter(StringUtils::hasText) + .orElse(UUID.randomUUID().toString()); resp.setHeader("X-Correlation-Id", correlationId); logIncomingRequest(req, correlationId); @@ -53,8 +53,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter { } finally { long tookMs = (System.nanoTime() - startNs) / 1_000_000; - String requestBody = readBody(req.getContentAsByteArray(), req.getCharacterEncoding()); - String responseBody = readBody(resp.getContentAsByteArray(), resp.getCharacterEncoding()); + Map reqParams = paramsMap(req); Map reqHeaders = headersMap(req); Map respHeaders = headersMap(resp); @@ -63,17 +62,16 @@ public class HttpLoggingFilter extends OncePerRequestFilter { mask(respHeaders); log.info( - "HTTP (RESPONSE) {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqBody={} | respHeaders={} | respBody={}", - req.getMethod(), - req.getRequestURI(), - req.getQueryString() == null ? "" : "?" + req.getQueryString(), - resp.getStatus(), - tookMs, - correlationId, - reqHeaders, - requestBody, - respHeaders, - responseBody + "HTTP (RESPONSE) {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}", + req.getMethod(), + req.getRequestURI(), + req.getQueryString() == null ? "" : "?" + req.getQueryString(), + resp.getStatus(), + tookMs, + correlationId, + reqHeaders, + reqParams, + respHeaders ); resp.copyBodyToResponse(); @@ -82,19 +80,19 @@ public class HttpLoggingFilter extends OncePerRequestFilter { private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) { - String requestBody = readBody(req.getContentAsByteArray(), req.getCharacterEncoding()); + Map reqParams = paramsMap(req); Map reqHeaders = headersMap(req); mask(reqHeaders); log.info( - "HTTP (REQUEST) {} {}{} | cid={} | reqHeaders={} | reqBody={}", + "HTTP (REQUEST) {} {}{} | cid={} | reqHeaders={} | reqParams={}", req.getMethod(), req.getRequestURI(), req.getQueryString() == null ? "" : "?" + req.getQueryString(), correlationId, reqHeaders, - requestBody + reqParams ); } @@ -102,22 +100,32 @@ public class HttpLoggingFilter extends OncePerRequestFilter { return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY); } - private static String readBody(byte[] buf, String encoding) { - if (buf == null || buf.length == 0) return ""; - var bytes = buf.length > MAX_BODY ? Arrays.copyOf(buf, MAX_BODY) : buf; - String body = new String(bytes, encoding != null ? java.nio.charset.Charset.forName(encoding) : StandardCharsets.UTF_8); - if (buf.length > MAX_BODY) body += "…[truncated]"; - return body; - } - private static Map headersMap(HttpServletRequest req) { return Collections.list(req.getHeaderNames()).stream() - .collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new)); + .collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new)); + } + + private Map paramsMap(ContentCachingRequestWrapper req) { + Map paramsMap = new LinkedHashMap<>(); + req.getParameterMap().forEach((k, v) -> { + String params = String.join(", ", v); + paramsMap.put(k, params); + }); + + try { + Collection fileParts = req.getParts(); + fileParts.forEach(part -> { + paramsMap.put(part.getName(), part.getSubmittedFileName()); + }); + } catch (Exception e) { + // ignore + } + return paramsMap; } private static Map headersMap(HttpServletResponse resp) { return resp.getHeaderNames().stream() - .collect(Collectors.toMap(h -> h, resp::getHeader, (a, b) -> a, LinkedHashMap::new)); + .collect(Collectors.toMap(h -> h, resp::getHeader, (a, b) -> a, LinkedHashMap::new)); } private static void mask(Map headers) {