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?
10
A
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.
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