22
33import java .io .IOException ;
44import java .nio .charset .StandardCharsets ;
5- import java .util .ArrayList ;
65import java .util .Collection ;
76import java .util .Enumeration ;
87import java .util .HashMap ;
9- import java .util .List ;
108import java .util .Map ;
119import java .util .UUID ;
1210
2523import org .slf4j .Logger ;
2624import org .slf4j .LoggerFactory ;
2725import org .slf4j .MDC ;
26+ import org .springframework .core .annotation .Order ;
27+ import org .springframework .stereotype .Component ;
2828import org .springframework .web .filter .OncePerRequestFilter ;
2929import org .springframework .web .util .ContentCachingRequestWrapper ;
3030import org .springframework .web .util .ContentCachingResponseWrapper ;
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 )
4140public 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