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.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<String, String> reqParams = paramsMap(req);
Map<String, String> reqHeaders = headersMap(req);
Map<String, String> 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<String, String> reqParams = paramsMap(req);
Map<String, String> 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<String, String> 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<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) {
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<String, String> headers) {