Spring Boot Actuator Trace выполняет хорошую работу по захвату параметров ввода/вывода HTTP, заголовков, пользователей и т.д. Я хотел бы расширить его, чтобы также захватить тело ответа HTTP, таким образом, я могу иметь полное представление о том, что происходит и выходит из веб-слоя. Глядя на TraceProperties, не похоже, что есть способ настроить захват тела ответа. Есть ли "безопасный" способ захвата тела ответа, не испортив любой поток символов, который он отправляет?
Как включить тело ответа JSON в Spring Trace Boot Actuator?
Ответ 1
Недавно я написал блог о настройке конечной точки Spring Boot Actuator trace, и во время игры с Actuator я был несколько удивлен, что response body не является одним из поддерживаемых свойств для отслеживания.
Я подумал, что мне может понадобиться эта функция, и нашел быстрое решение благодаря Logback TeeFilter.
Чтобы продублировать выходной поток ответа, я скопировал и использовал TeeHttpServletResponse и TeeServletOutputStream без особого изучения.
Затем, как я объяснил в сообщении в блоге, расширенный WebRequestTraceFilter вроде:
@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;
}
}
Теперь вы можете видеть responseBody в подаче конечной точки JSON trace.