2016-03-07 15 views
10

Thiết bị truyền động khởi động của mùa xuân Trace thực hiện tốt việc thu thập thông tin HTTP đầu vào/đầu ra, tiêu đề, người dùng, v.v. Tôi muốn mở rộng nó để nắm bắt cơ thể phản hồi HTTP, theo cách đó tôi có thể xem toàn bộ những gì đang đến và đi ra khỏi lớp web. Nhìn vào TraceProperties, có vẻ như không có cách nào để định cấu hình phản hồi nội dung. Có cách nào "an toàn" để nắm bắt cơ thể phản hồi mà không làm rối tung luồng ký tự nào đang gửi lại không?Làm cách nào để bao gồm nội dung phản hồi JSON trong Dấu vết của bộ khởi động Spring Boot?

Trả lời

2

Gần đây, tôi đã viết một blog post về tuỳ biến của trace endpoint Xuân Boot Actuator và khi chơi với Actuator, tôi đã kinda ngạc nhiên rằng response body không phải là một trong những tài sản được hỗ trợ để theo dõi.

Tôi nghĩ rằng tôi có thể cần tính năng này và đưa ra giải pháp nhanh chóng nhờ vào Logback's TeeFilter.

Để sao chép luồng đầu ra của phản hồi, tôi đã sao chép và sử dụng TeeHttpServletResponseTeeServletOutputStream mà không kiểm tra quá nhiều.

Sau đó, giống như tôi đã giải thích trong bài viết trên blog, mở rộng WebRequestTraceFilter như:

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

Bây giờ, bạn có thể nhìn thấy responseBody trong JSON trace endpoint phục vụ.

+0

Tôi đã cố gắng sử dụng câu trả lời này. Sao chép mã chính xác từ trên xuống và hai lớp TeeHttpServletResponse và TeeServletOutputStream. Bây giờ/dấu vết cho tôi 500 với "Không thể gọi sendError() sau khi phản hồi đã được cam kết", và bất kỳ tài nguyên nào khác cho tôi 200 lỗi "lỗi cú pháp" của cơ thể. Trong bản ghi mùa xuân, tôi không thể thấy bất kỳ lỗi nào – isADon

Các vấn đề liên quan