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

Slf4jRequestLog ist nur Logging-Anfrage-Methode, URL und Datum und Antwort Statuscode und Bytes geschrieben. Ich möchte Körper für meine PUT/POST-Anfragen definitiv protokollieren. I abgeleitet CustomSlf4jRequestLog von Slf4jRequestLog und ich versuchte:Anlegesteg Server Log-Anforderung Körper

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()); 

Leider ist kein Körper ausgedruckt, wie sie bereits von Handler verarbeitet wird?

Ist es möglich, Körper der Anfrage hier zu bekommen?

(Ich sorge mich wirklich um Körper, weil ich JsonProvider habe und ich möchte eine ganze Reihe von Anfrage sehen, wenn Json nicht Daten parsen) Oder wenn meine App fehlschlägt Ich will sehen, was verursacht, ohne Protokollierung für jede Eingabeanforderung hinzuzufügen .

Antwort

0

Servlet-Spezifikation, die sich hier in Ihrem Weg befindet.

Die eigentliche Servlet, das die Anforderung verarbeitet bereits die Anforderung Körper gelesen hat, liest zerreißend weiter von request.getInputStream() ungültig (Sie bei EOF) sind

Wenn Sie die Anforderung Körper aufnehmen möchten, werden Sie erstellen müssen ein benutzerdefiniertes Servlet Filter, und wickeln Sie dann die HttpServletRequest, die ANDgetReader() Methoden mit Ihren eigenen Implementierungen, die eine Kopie der Daten, die gelesen wurden, überschreiben.

Dann ist es an Ihnen, um zu bestimmen, was Sie mit dieser Kopie der Anfrage Körper Inhalt tun möchten.

oder

Sie können nur ein Netzwerk-Capture-Dienstprogramm wie Wireshark verwenden, um zu sehen, was der Anfrage Körper war. Auch wenn Sie HTTPS verwenden, können Sie Wireshark mit Ihrem Serverzertifikat konfigurieren, um die verschlüsselte Konversation zu überprüfen.

0

Der Logger ruft getInputStream() auf der gleichen Anfrage erneut. Sie dürfen die gleichen Daten nicht zweimal lesen. Sie sollten einen ServletRequestWrapper erstellen, um eine Kopie des Hauptteils der Anfrage zu erstellen.

Verwandte Themen