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?
10
A
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.
Problemi correlati
- 1. Abilita CORS per/endpoint salute in Spring Boot Actuator
- 2. Leggere il corpo della risposta in un interceptor Spring Intel
- 3. come ottenere le metriche da spring-boot-actuator a livello di codice?
- 4. Come abilitare la cache di risposta HTTP in Spring Boot
- 5. Come cambiare il corpo in risposta OkHttp?
- 6. Come configurare Jetty in spring-boot (facilmente?)
- 7. Come cambiare il corpo della risposta con Charles?
- 8. Cattura e registra il corpo della risposta
- 9. GZIP il corpo della risposta in PlayFramework 2.0
- 10. json formato della data in primavera-boot
- 11. Spring MVC -> Risposta JSON
- 12. Come controllare JSON nel corpo di risposta con mockMvc
- 13. recupero dati dal database come json in spring boot
- 14. Come includere campi della classe genitore in risposta JSON utilizzando montanti 2 JSON plug
- 15. Come registrare il corpo della richiesta HTTP in Spring MVC?
- 16. Come usare il Dozer con Spring Boot?
- 17. Come impostare il corpo di risposta in javax.ws.rs.core.Response
- 18. Leggere il corpo di una risposta 400?
- 19. Estensione Chrome - Come ottenere il corpo della risposta HTTP?
- 20. Spring boot Caricamento di file multipart come parte di json body
- 21. Come disabilitare ErrorPageFilter in Spring Boot?
- 22. Spring Boot Actuator/endpoint salute non mostra le informazioni sul database o sul file system
- 23. corpo risposta registrazione espressa
- 24. Aggiungere campi dinamici a Spring Risposta JSON
- 25. Come posso accedere al corpo della risposta http Angular 2 senza convertirlo in stringa o json?
- 26. JSON Java 8 Formato LocalDateTime in Spring Boot
- 27. Invio della risposta di codifica in JSON
- 28. Spring Json non risolto con risposta appropriata
- 29. Risposta HTTP 500 con il corpo?
- 30. Le proprietà della riga di comando spring-boot sono disponibili quando si utilizza spring-boot: run?
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