2012-09-11 89 views
10

我們通過Spring MVC公開了REST服務。我們使用HandlerExceptionResolver來記錄異常。目前,我們記錄以下內容:如何登錄RESTful發佈數據?

  • 異常及其堆棧跟蹤
  • 的URL
  • 請求頭

這將使調試更加容易,如果我們也可以登錄該JSON後的數據作爲好。有關如何獲得此建議的任何建議?

回答

10

您需要一個過濾器,以便在讀取時保存請求主體,並在以後將保存的數據提供給異常記錄器。

春天包含AbstractRequestLoggingFilter做類似的事情。雖然它不直接適用於您的問題,但您可以將其用作實施自己的過濾器的參考。

+1

如果你使用Spring 4.1.3+(見SPR-12477),請確保您的過濾器映射到你的MVC調度Servlet和不'/*,否則你的請求將不會被封裝在基本的ContentCachingRequestWrapper中。 –

+1

@LászlóvandenHoek,你能詳細說明一下嗎?我不跟着你。我正在使用'ContentCachingRequestWrapper',但請求主體始終是一個空字符串。 –

+0

@AbhijithMadhav過濾器通過將它們映射到URL模式或servlet來啓用。我的意思是,你需要確保你將'AbstractRequestLoggingFilter'映射到調度器,而不是'/ *'URL模式。 –

4

有沒有簡單的方法來記錄請求/響應的有效負載。您可以使用Java Web過濾器攔截所有請求和響應,並從流中讀取JSON數據。但是有一個問題,當你從流中讀取數據時,實際的數據將從流中被耗盡。

因此,您必須實現實際的請求和響應對象的包裝。只有請求響應的複製版本纔會被記錄。我們已經實施了類似的解決方案如下一樣,它滿足了我們的要求:

http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/

16

添加這代表應用程序的配置類:

import javax.servlet.Filter; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.web.filter.AbstractRequestLoggingFilter; 

....

@Bean 
public Filter loggingFilter(){ 
    AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() { 

     @Override 
     protected void beforeRequest(HttpServletRequest request, String message) { 
      System.out.println("beforeRequest: " +message); 
     } 

     @Override 
     protected void afterRequest(HttpServletRequest request, String message) { 
      System.out.println("afterRequest: " +message); 
     } 
    }; 
    f.setIncludeClientInfo(true); 
    f.setIncludePayload(true); 
    f.setIncludeQueryString(true); 

    f.setBeforeMessagePrefix("BEFORE REQUEST ["); 
    f.setAfterMessagePrefix("AFTER REQUEST ["); 
    f.setAfterMessageSuffix("]\n"); 
    return f; 
} 

你可能要註釋掉

f.setIncludePayload(true);