2011-08-18 17 views
25

Ho bisogno di tutte le richieste SOAP registrate nello CommonLogFormat (vedere http://en.wikipedia.org/wiki/Common_Log_Format), oltre alla durata (la quantità di tempo necessaria per elaborare la richiesta).Come posso fare in modo che i servizi Web di Spring registrino tutte le richieste SOAP?

Qual è il modo migliore per farlo? Sembra che sia possibile configurare log4j per Spring WebServices ma registrerà tutti i valori a cui sono interessato? http://pijava.wordpress.com/2009/12/04/spring-webservice-soap-requestresponse-logging-with-log4j/

MODIFICA: Attualmente stiamo usando SLF4J, non Log4j. Inoltre, sembra possibile farlo configurando PayloadLoggingInterceptor: http://static.springsource.org/spring-ws/site/reference/html/server.html#server-endpoint-interceptor

Ma non sono sicuro di dove verranno inviati i messaggi di registro. Ho aggiunto quell'intercettore ai nostri intercettori e non vedo alcun messaggio di registro.

risposta

29

È possibile utilizzarlo per registrare il paylod non elaborato delle chiamate di servizio Web in entrata e in uscita. Non sono sicuro di come registrare la durata della comunicazione del servizio web.

<!-- Spring Webservice XML --> 
    <logger name="org.springframework.ws.client.MessageTracing"> 
    <level value="TRACE"/> 
    </logger> 
    <logger name="org.springframework.ws.server.MessageTracing"> 
    <level value="TRACE"/> 
    </logger> 

Ulteriori dettagli possono essere trovati a http://static.springsource.org/spring-ws/site/reference/html/common.html#logging

+0

Non riesco a trovare queste classi in spring-ws 1.5.9 – wytten

+4

Non sono classi, sono categorie che sono registrate. Vedere la documentazione su http://static.springsource.org/spring-ws/site/reference/html/common.html#logging – JustinKSU

+0

PayloadLoggingInterceptor potrebbe essere utile. Il poster originale ha aggiunto un collegamento ad esso. – JustinKSU

16

Questo ha funzionato per me. Registra il messaggio di richiesta inviato e la risposta ricevuta. Potresti calcolare il tempo totale estratto dal registro.

log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE 
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE 
+3

Ovviamente, questo dovrebbe essere aggiunto al file log4j.properties. –

7

In primo luogo, SLF4J è solo una facciata semplice. Significa che hai ancora bisogno di un framework di registrazione (ad esempio java.util.logging, logback, log4j).

In secondo luogo, Spring-ws utilizza l'interfaccia Commons Logging che è un'altra facciata semplice come SLF4J.

Infine, è possibile utilizzare l'impostazione in basso per abilitare la funzionalità di registrazione dei messaggi di Spring-ws.

log4j.logger.org.springframework.ws.client.MessageTracing.sent=DEBUG 
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE 

log4j.logger.org.springframework.ws.server.MessageTracing.sent=DEBUG 
log4j.logger.org.springframework.ws.server.MessageTracing.received=TRACE 
+2

Questo ha funzionato per me. Grazie. Qualcuno sa come stampare bene il SOAP nei log? – theINtoy

5

includere quanto segue nel file log4j.properties ...

  1. Per registrare tutti i messaggi sul lato server: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. Per registrare tutti i messaggi lato client: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE

Sul piano DEBUG - solo l'elemento principale payload viene registrato

Sul Livello TRACE - l'intero contenuto del messaggio viene registrato

Infine, per registrare solo i messaggi inviati o ricevuti utilizzare .sent o .received alla fine delle configurazioni.

es: log4j.logger.org.springframework.ws.server.MessageTracing.received=DEBUG registra il lato client ricevuto elemento massaggi payload principale ritorno:

DEBUG WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [[email protected]62d9] to [http://localhost:8080/mock-platform/services] 

Per ulteriori info

25

Per Primavera Boot progetto aggiungendo di seguito in application.properties ha lavorato per me:

logging.level.org.springframework.web=DEBUG 
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG 
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG 
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE 
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE 
1

Se si dispone del proprio sistema di registrazione, il seguente intercettore può essere un'alternativa per registrare i messaggi SOAP.

setInterceptors(new ClientInterceptor[]{new ClientInterceptor() { 

     @Override 
     public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException { 
      System.out.println("### SOAP RESPONSE ###"); 
      try { 
       ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
       messageContext.getResponse().writeTo(buffer); 
       String payload = buffer.toString(java.nio.charset.StandardCharsets.UTF_8.name()); 
       System.out.println(payload); 
      } catch (IOException e) { 
       throw new WebServiceClientException("Can not write the SOAP response into the out stream", e) { 
        private static final long serialVersionUID = -7118480620416458069L; 
       }; 
      } 

      return true; 
     } 

     @Override 
     public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 

      System.out.println("### SOAP REQUEST ###"); 
      try { 
       ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
       messageContext.getRequest().writeTo(buffer); 
       String payload = buffer.toString(java.nio.charset.StandardCharsets.UTF_8.name()); 
       System.out.println(payload); 
      } catch (IOException e) { 
       throw new WebServiceClientException("Can not write the SOAP request into the out stream", e) { 
        private static final long serialVersionUID = -7118480620416458069L; 
       }; 
      } 

      return true; 
     } 

     @Override 
     public boolean handleFault(MessageContext messageContext) throws WebServiceClientException { 
      System.out.println("### SOAP FAULT ###"); 
      try { 
       ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
       messageContext.getResponse().writeTo(buffer); 
       String payload = buffer.toString(java.nio.charset.StandardCharsets.UTF_8.name()); 
       System.out.println(payload); 
      } catch (IOException e) { 
       throw new WebServiceClientException("Can not write the SOAP fault into the out stream", e) { 
        private static final long serialVersionUID = 3538336091916808141L; 
       }; 
      } 

      return true; 
     } 
    }}); 

In ogni metodo maniglia si può facilmente utilizzare payload per ottenere messaggi SOAP prime.

Problemi correlati