2016-03-07 2 views
10

Trace Spring Boot Actuator fait un bon travail de capture des paramètres HTTP d'entrée/sortie, des en-têtes, des utilisateurs, etc. Je voudrais l'étendre pour capturer également le corps de la réponse HTTP, de sorte que je peux avoir une vue complète de ce qui entre et sort de la couche Web. En regardant le TraceProperties, il ne semble pas y avoir un moyen de configurer la capture du corps de la réponse. Existe-t-il un moyen "sûr" de capturer le corps de la réponse sans gâcher le flux de caractères qu'il renvoie?Comment inclure le corps de la réponse JSON dans la trace de Spring Boot Actuator?

Répondre

2

Récemment, j'ai écrit un blog post sur la personnalisation du point final de Spring Boot actionneur trace et tout en jouant avec l'actionneur, je suis un peu surpris que response body n'est pas une des propriétés prises en charge pour retrouver la trace.

Je pensais avoir besoin de cette fonctionnalité et j'ai trouvé une solution rapide grâce au TeeFilter de Logback.

Pour dupliquer le flux de sortie de la réponse, j'ai copié et utilisé TeeHttpServletResponse et TeeServletOutputStream sans trop d'examen.

Alors, comme je l'ai expliqué dans le billet de blog, étendu WebRequestTraceFilter comme:

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

Maintenant, vous pouvez voir responseBody dans le point final JSON trace sert.

+0

J'ai essayé d'utiliser cette réponse. Copié le code exact ci-dessus et les deux classes TeeHttpServletResponse et TeeServletOutputStream. Maintenant/trace me donne 500 avec "Impossible d'appeler sendError() après que la réponse a été validée", et toute autre ressource me donne 200 avec le corps "erreur de syntaxe". Dans les journaux de printemps, je ne vois aucune erreur – isADon