2015-07-17 8 views
7

Ich verwende spring mit RestTemplate, um GET Abfragen auszuführen.Wie protokolliere ich die RestTemplate Anfrage und Antwort mit der Feder?

Wie kann ich bei jeder Anfrage automatisch alle Anfrage- und Antwortdaten in eine Logdatei eintragen?

+1

möglich Duplikat [? Frühling RestTemplate - wie voll Debugging/Protokollierung von Anfragen/Antworten ermöglichen] (http://stackoverflow.com/questions/7952154/spring -resttemplate-how-to-enable-full-debuggen-logging-of-requests-responses) – rhorvath

+0

Das hilft nicht, denn wenn ich die Nachricht abfangen würde, hätte ich Java-Objekte vom Typ 'org.springframework.http.client .InterceptingClientHttpRequest' und 'org.springframework.http.client.SimpleClientHttpResponse'. Was ich brauche, ist eine Text/XML-Darstellung der Antwort und protokolliere diese stattdessen. – membersound

+2

haben Sie versucht, Nachrichten zu senden, die Apache httpClient an die restTempalte übergeben und das Protokoll auf der Ebene von httpclient aktivieren? – Giovanni

Antwort

4

Sie können dies erreichen, indem Sie im Frühjahr ClientHttpRequestInterceptor verwenden. Sie müssen die Methode intercept der Schnittstelle ClientHttpRequestInterceptor überschreiben.

Unten ist der Code-Schnipsel:

@Component 
public class LogRequestResponseFilter implements ClientHttpRequestInterceptor { 

private static final Logger logger=LoggerFactory.getLogger(LogRequestResponseFilter.class); 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) 
     throws IOException { 

     traceRequest(request, body); 
     ClientHttpResponse clientHttpResponse = execution.execute(request, body); 
     traceResponse(clientHttpResponse); 

     return clientHttpResponse; 
    } 

private void traceRequest(HttpRequest request, byte[] body) throws IOException { 
     logger.debug("request URI : " + request.getURI()); 
     logger.debug("request method : " + request.getMethod()); 
     logger.debug("request body : " + getRequestBody(body)); 
    } 

    private String getRequestBody(byte[] body) throws UnsupportedEncodingException { 
     if (body != null && body.length > 0) { 
     return (new String(body, "UTF-8")); 
     } else { 
     return null; 
     } 
    } 


    private void traceResponse(ClientHttpResponse response) throws IOException { 
     String body = getBodyString(response); 
     logger.debug("response status code: " + response.getStatusCode()); 
     logger.debug("response status text: " + response.getStatusText()); 
     logger.debug("response body : " + body); 
    } 

    private String getBodyString(ClientHttpResponse response) { 
     try { 
     if (response != null && response.getBody() != null) {// && 
                   // isReadableResponse(response)) 
                   // { 
      StringBuilder inputStringBuilder = new StringBuilder(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), StandardCharsets.UTF_8)); 
      String line = bufferedReader.readLine(); 
      while (line != null) { 
       inputStringBuilder.append(line); 
       inputStringBuilder.append('\n'); 
       line = bufferedReader.readLine(); 
      } 
      return inputStringBuilder.toString(); 
     } else { 
      return null; 
     } 
     } catch (IOException e) { 
     logger.error(e.getMessage(), e); 
     return null; 
     } 
    } 
+0

Reicht es aus, nur '@ Component' zum benutzerdefinierten' Interceptor' hinzuzufügen? Oder muss ich es irgendwo explizit registrieren, zB auf einer 'RestTemplate'? Denn das versuche ich zu verhindern: Ich muss mich selbst registrieren und verkabeln. – membersound

+0

Ich glaube @Component ist ausreichend. Sie können den folgenden Link folgen, der eine gute Beispielquelle ist. http://blog.cacoveanu.com/2016/06/24/rest-template-logging.html –

+2

Dies protokolliert korrekt, aber was passiert, wenn der zugrunde liegende 'InputStream' die Markierung nicht unterstützt? Sobald es gelesen ist, ist es weg. –