2016-03-07 63 views
10

Spring Boot Actuator的Trace在捕獲輸入/輸出HTTP params,頭文件,用戶等方面做得很好。我想擴展它來捕獲HTTP響應的主體,這樣我就可以全面瞭解什麼是進入和離開網絡層。看看TraceProperties,看起來好像沒有辦法配置響應主體捕獲。是否有一種「安全」的方式來捕捉響應主體而不會搞亂它發回的任何字符流?如何在Spring Boot Actuator的跟蹤中包含JSON響應體?

回答

2

最近,我寫了一個關於定製Spring Boot Actuator的trace端點的blog post,並且在使用Actuator時,我有點驚訝response body不是支持的屬性之一。

我想我可能需要這個功能,並且由於Logback的TeeFilter提出了一個快速解決方案。

要複製響應的輸出流,我複製和使用TeeHttpServletResponseTeeServletOutputStream沒有太多的考試。

然後,就像我在博客中解釋說,延長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; 
    } 
} 

現在,你可以在JSON trace端點提供看responseBody

+0

我試着用這個答案。複製了上面的確切代碼和TeeHttpServletResponse和TeeServletOutputStream兩個類。現在/跟蹤給我500與「無法調用響應後提交的sendError()提交」,和任何其他資源給我200身體「語法錯誤」。在春天日誌中我看不到任何錯誤 – isADon

相關問題