2016-03-07 7 views
10

Spring Boot Actuator's Trace fa un buon lavoro di acquisizione di input/output parametri HTTP, intestazioni, utenti, ecc. Mi piacerebbe espanderlo per catturare anche il corpo della risposta HTTP, in questo modo posso avere una visione completa di cosa sta arrivando e sta uscendo dal livello web. Guardando lo TraceProperties, non sembra che ci sia un modo per configurare l'acquisizione del corpo della risposta. Esiste un modo "sicuro" per catturare il corpo della risposta senza intaccare il flusso di caratteri che sta inviando?Come includere il corpo della risposta JSON in Trace di Spring Boot Actuator?

risposta

2

Recentemente, ho scritto un blog post sulla personalizzazione di trace endpoint di primavera Boot attuatore e mentre gioca con attuatore, sono rimasto un po sorpreso che response body non è una delle proprietà supportate da rintracciare.

Ho pensato che potrei aver bisogno di questa funzione e ho trovato una soluzione rapida grazie a Logback TeeFilter.

Per duplicare il flusso di output della risposta, ho copiato e utilizzato TeeHttpServletResponse e TeeServletOutputStream senza troppi esami.

Poi, proprio come ho spiegato nel post del blog, esteso WebRequestTraceFilter come:

@Component 
public class RequestTraceFilter extends WebRequestTraceFilter { 

    RequestTraceFilter(TraceRepository repository, TraceProperties properties) { 
     super(repository, properties); 
    } 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response); 

     filterChain.doFilter(request, teeResponse); 

     teeResponse.finish(); 

     request.setAttribute("responseBody", teeResponse.getOutputBuffer()); 

     super.doFilterInternal(request, teeResponse, filterChain); 
    } 

    @Override 
    protected Map<String, Object> getTrace(HttpServletRequest request) { 
     Map<String, Object> trace = super.getTrace(request); 

     byte[] outputBuffer = (byte[]) request.getAttribute("responseBody"); 

     if (outputBuffer != null) { 
      trace.put("responseBody", new String(outputBuffer)); 
     } 

     return trace; 
    } 
} 

Ora, si può vedere responseBody nel JSON trace endpoint serve.

+0

Ho provato a usare questa risposta. Copiato il codice esatto da sopra e le due classi TeeHttpServletResponse e TeeServletOutputStream. Now/trace mi dà 500 con "Can not call sendError() dopo che la risposta è stata confermata", e qualsiasi altra risorsa mi dà 200 con il corpo "errore di sintassi". Nei registri primaverili non vedo errori – isADon

Problemi correlati