http://jira.mfd.msk:8088/browse/BKI-3215 Added reqParams to HttpLoggingFilter

This commit is contained in:
Mikhail Trofimov 2025-10-01 14:45:07 +03:00
parent ea12395559
commit dc89f17761

View file

@ -4,6 +4,7 @@ import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -13,7 +14,6 @@ import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper; import org.springframework.web.util.ContentCachingResponseWrapper;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -29,7 +29,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
protected boolean shouldNotFilter(HttpServletRequest request) { protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI(); String path = request.getRequestURI();
return path.startsWith("/actuator/health") || path.startsWith("/swagger") 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 @Override
@ -53,8 +53,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
} finally { } finally {
long tookMs = (System.nanoTime() - startNs) / 1_000_000; long tookMs = (System.nanoTime() - startNs) / 1_000_000;
String requestBody = readBody(req.getContentAsByteArray(), req.getCharacterEncoding()); Map<String, String> reqParams = paramsMap(req);
String responseBody = readBody(resp.getContentAsByteArray(), resp.getCharacterEncoding());
Map<String, String> reqHeaders = headersMap(req); Map<String, String> reqHeaders = headersMap(req);
Map<String, String> respHeaders = headersMap(resp); Map<String, String> respHeaders = headersMap(resp);
@ -63,7 +62,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
mask(respHeaders); mask(respHeaders);
log.info( log.info(
"HTTP (RESPONSE) {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqBody={} | respHeaders={} | respBody={}", "HTTP (RESPONSE) {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}",
req.getMethod(), req.getMethod(),
req.getRequestURI(), req.getRequestURI(),
req.getQueryString() == null ? "" : "?" + req.getQueryString(), req.getQueryString() == null ? "" : "?" + req.getQueryString(),
@ -71,9 +70,8 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
tookMs, tookMs,
correlationId, correlationId,
reqHeaders, reqHeaders,
requestBody, reqParams,
respHeaders, respHeaders
responseBody
); );
resp.copyBodyToResponse(); resp.copyBodyToResponse();
@ -82,19 +80,19 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) { private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) {
String requestBody = readBody(req.getContentAsByteArray(), req.getCharacterEncoding()); Map<String, String> reqParams = paramsMap(req);
Map<String, String> reqHeaders = headersMap(req); Map<String, String> reqHeaders = headersMap(req);
mask(reqHeaders); mask(reqHeaders);
log.info( log.info(
"HTTP (REQUEST) {} {}{} | cid={} | reqHeaders={} | reqBody={}", "HTTP (REQUEST) {} {}{} | cid={} | reqHeaders={} | reqParams={}",
req.getMethod(), req.getMethod(),
req.getRequestURI(), req.getRequestURI(),
req.getQueryString() == null ? "" : "?" + req.getQueryString(), req.getQueryString() == null ? "" : "?" + req.getQueryString(),
correlationId, correlationId,
reqHeaders, reqHeaders,
requestBody reqParams
); );
} }
@ -102,19 +100,29 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY); 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<String, String> headersMap(HttpServletRequest req) { private static Map<String, String> headersMap(HttpServletRequest req) {
return Collections.list(req.getHeaderNames()).stream() 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<String, String> paramsMap(ContentCachingRequestWrapper req) {
Map<String, String> paramsMap = new LinkedHashMap<>();
req.getParameterMap().forEach((k, v) -> {
String params = String.join(", ", v);
paramsMap.put(k, params);
});
try {
Collection<Part> fileParts = req.getParts();
fileParts.forEach(part -> {
paramsMap.put(part.getName(), part.getSubmittedFileName());
});
} catch (Exception e) {
// ignore
}
return paramsMap;
}
private static Map<String, String> headersMap(HttpServletResponse resp) { private static Map<String, String> headersMap(HttpServletResponse resp) {
return resp.getHeaderNames().stream() 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));