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