2016-03-07 6 views
10

Spring Boot Actuators Trace macht eine gute Arbeit der Erfassung von Eingabe/Ausgabe HTTP-Parameter, Header, Benutzer, etc. Ich möchte es auch den Körper der HTTP-Antwort erfassen, so dass ich eine vollständige Ansicht von haben was kommt und geht aus der Web-Schicht. Wenn man sich die TraceProperties anschaut, sieht es nicht so aus, als gäbe es eine Möglichkeit, die Erfassung von Antwortdaten zu konfigurieren. Gibt es eine "sichere" Möglichkeit, den Antwortkörper zu erfassen, ohne den von ihm gesendeten Zeichenstrom zu verfälschen?Wie wird der JSON-Antwortkörper in den Trace des Spring Boot Actuators aufgenommen?

Antwort

2

Vor kurzem schrieb ich ein blog post über die Anpassung von Feder Boot-Stellantrieb-trace Endpunkt und während mit Actuator spielen, ich war ein bisschen überrascht, dass response body nicht einer der unterstützten Eigenschaften ist zu verfolgen.

Ich dachte, ich könnte diese Funktion benötigen und kam mit Logback TeeFilter eine schnelle Lösung.

Um Ausgangsstrom der Antwort zu duplizieren, kopierte ich und TeeHttpServletResponse und TeeServletOutputStream ohne zu viel Prüfung verwendet.

Dann, so wie ich in der Blog-Post erklärt, erweiterte WebRequestTraceFilter wie:

@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; 
    } 
} 

Jetzt, Sie responseBody im JSON trace Endpunkt dient sehen können.

+0

Ich habe versucht, diese Antwort zu verwenden. Kopierte den genauen Code von oben und die zwei Klassen TeeHttpServletResponse und TeeServletOutputStream. Jetzt/Trace gibt mir 500 mit "Kann sendError() nicht aufrufen, nachdem die Antwort festgeschrieben wurde", und alle anderen Ressourcen gibt mir 200 mit dem Körper "Syntaxfehler". Im Frühjahr Logs kann ich keine Fehler sehen – isADon