2016-04-25 127 views
0
RequestLogHandler requestLogHandler = new RequestLogHandler(); 
Slf4jRequestLog requestLog = new CustomSlf4jRequestLog(); 
requestLogHandler.setRequestLog(requestLog); 

Slf4jRequestLog只記錄請求方法,url和日期以及響應狀態碼和寫入的字節。 我絕對想爲我的PUT/POST請求記錄正文。 我從Slf4jRequestLog衍生CustomSlf4jRequestLog,我試圖:碼頭服務器日誌請求體

public void log(Request request, Response response) { 
     StringBuilder sb = new StringBuilder("RequestBody: "); 
     try { 
      LOG.info("BODY SIZE: " + request.getContentLength()); 
      BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream())); 
      String line; 
      while ((line = in.readLine()) != null) { 
       sb.append(line); 
      } 
      LOG.info(sb.toString()); 

不幸的是沒有體被打印出來,因爲它已經由處理程序處理?

在這裏可以得到要求的身體嗎?我真的很在乎身體,因爲我有JsonProvider,當Json無法解析數據時,我希望看到整個請求)或者當我的應用程序失敗時,我想查看是什麼原因造成的,無需爲每個輸入請求添加日誌記錄。

回答

0

Servlet規範在這裏得到你的方式。

正在處理該請求已經閱讀請求主體的實際的servlet,進一步撕心裂肺從讀取request.getInputStream()無效的(你在EOF)

如果你想捕捉的請求主體,你需要創建一個自定義的Servlet Filter,然後包裝HttpServletRequest,覆蓋getInputStream()getReader()方法與您自己的實現,使讀取的數據的副本。

然後,它決定你想要做什麼與請求正文內容的副本。

你可以使用Wireshark之​​類的網絡捕獲工具,看看有什麼要求身體。即使您使用HTTPS,也可以使用服務器證書配置Wireshark以檢查加密的對話。

0

記錄器再次對同一個請求調用getInputStream()。您不允許兩次讀取相同的數據。呦應該創建一個ServletRequestWrapper來製作請求主體的副本。