Skip to content

Commit cd8f702

Browse files
BREAKING CHANGE: restore PathRequestLoggingFilter
Any service implementing this change needs to remove their own logback-spring.xml or add the appenders that will be added to java-mdx-web/src/main/resources/logback-spring.xml to their own instance
1 parent a3de84a commit cd8f702

1 file changed

Lines changed: 56 additions & 10 deletions

File tree

mdx-web/src/main/java/com/mx/path/model/mdx/web/filter/PathRequestLoggingFilter.java

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
import java.io.IOException;
44
import java.nio.charset.StandardCharsets;
5-
import java.util.ArrayList;
65
import java.util.Collection;
76
import java.util.Enumeration;
87
import java.util.HashMap;
9-
import java.util.List;
108
import java.util.Map;
119
import java.util.UUID;
1210

@@ -25,6 +23,8 @@
2523
import org.slf4j.Logger;
2624
import org.slf4j.LoggerFactory;
2725
import org.slf4j.MDC;
26+
import org.springframework.core.annotation.Order;
27+
import org.springframework.stereotype.Component;
2828
import org.springframework.web.filter.OncePerRequestFilter;
2929
import org.springframework.web.util.ContentCachingRequestWrapper;
3030
import org.springframework.web.util.ContentCachingResponseWrapper;
@@ -35,9 +35,8 @@
3535
* This filter logs incoming requests.
3636
* These values are inserted into the MDC.
3737
*/
38-
// TODO Needs more testing before enabling. This is causing opensearch issues
39-
//@Component
40-
//@Order(FilterOrderSequence.REQUEST_LOGGING_FILTER)
38+
@Component
39+
@Order(FilterOrderSequence.REQUEST_LOGGING_FILTER)
4140
public class PathRequestLoggingFilter extends OncePerRequestFilter {
4241

4342
// Statics
@@ -156,6 +155,7 @@ private void logRequest(ContentCachingRequestWrapper request, ContentCachingResp
156155
MDC.remove("request_body");
157156
}
158157

158+
MDC.put("api_call_payload", buildApiPayload(response, request));
159159
MDC.put("request_duration", String.valueOf(elapsedTime));
160160
MDC.put("status", String.valueOf(response.getStatus()));
161161

@@ -190,6 +190,7 @@ private void logRequest(ContentCachingRequestWrapper request, ContentCachingResp
190190
* Resets the MDC by just cleaning up what we place there.
191191
*/
192192
protected void resetMDC() {
193+
MDC.remove("api_call_payload");
193194
MDC.remove("client_guid");
194195
MDC.remove("client_id");
195196
MDC.remove("device_trace_id");
@@ -212,6 +213,55 @@ protected void resetMDC() {
212213
MDC.remove("user_guid");
213214
}
214215

216+
private String buildApiPayload(ContentCachingResponseWrapper response, ContentCachingRequestWrapper request) {
217+
StringBuilder b = new StringBuilder();
218+
b.append("\n= Request\n\n");
219+
b.append(request.getMethod());
220+
b.append(" ");
221+
b.append(request.getRequestURL());
222+
b.append("\n\n");
223+
if (request.getHeaderNames() != null) {
224+
Map<String, String> requestHeaders = this.buildRequestHeadersMap(request);
225+
Map<String, String> maskedRequestHeaders = this.maskHeaders(requestHeaders);
226+
b.append(this.buildHeaderString(maskedRequestHeaders));
227+
}
228+
229+
String queryString = request.getQueryString();
230+
if (queryString != null) {
231+
Map<String, String> queryParams = this.buildQueryStringMap(queryString);
232+
b.append(this.buildHeaderString(this.maskHeaders(queryParams)));
233+
}
234+
235+
String requestBody = new String(request.getContentAsByteArray(), StandardCharsets.UTF_8);
236+
if (!requestBody.isEmpty()) {
237+
b.append("\n");
238+
b.append(MdxLogMasker.maskPayload(requestBody));
239+
b.append("\n");
240+
}
241+
242+
b.append("\n= Response\n\n");
243+
b.append(response.getStatus());
244+
b.append("\n");
245+
if (response.getHeaderNames() != null) {
246+
Map<String, String> responseHeaders = this.buildResponseHeadersMap(response);
247+
Map<String, String> maskedResponseHeaders = this.maskHeaders(responseHeaders);
248+
249+
if (response.getContentType() != null) {
250+
maskedResponseHeaders.put("Content-Type", response.getContentType());
251+
}
252+
253+
if (!maskedResponseHeaders.isEmpty()) {
254+
b.append(buildHeaderString(maskedResponseHeaders));
255+
}
256+
}
257+
258+
String responseBody = new String(response.getContentAsByteArray(), StandardCharsets.UTF_8);
259+
if (!responseBody.isEmpty()) {
260+
b.append(MdxLogMasker.maskPayload(responseBody));
261+
}
262+
return b.toString();
263+
}
264+
215265
private Map<String, String> buildRequestHeadersMap(HttpServletRequest request) {
216266
final Enumeration<String> headerNames = request.getHeaderNames();
217267
final Map<String, String> headerMap = new HashMap<>();
@@ -239,14 +289,10 @@ private Map<String, String> buildResponseHeadersMap(HttpServletResponse response
239289

240290
for (String headerName : headerNames) {
241291
final Collection<String> headerValues = response.getHeaders(headerName);
242-
String headerValuesFlattened = "";
243292

244293
if (headerValues != null) {
245-
final List<String> headerValuesList = new ArrayList<>(headerValues);
246-
headerValuesFlattened = String.join(", ", headerValuesList);
294+
headerMap.put(headerName, (String) headerValues.toArray()[0]);
247295
}
248-
249-
headerMap.put(headerName, headerValuesFlattened);
250296
}
251297

252298
return headerMap;

0 commit comments

Comments
 (0)