web-dev-qa-db-fra.com

Comment puis-je faire en sorte que tous les services Web Spring enregistrent tous les SOAP requêtes?

J'ai besoin de toutes les demandes SOAP connectées dans le CommonLogFormat (voir http://en.wikipedia.org/wiki/Common_Log_Format ), plus la durée (le temps qu'il faut pour traiter la demande).

Quelle est la meilleure façon de procéder? Il semble qu'il soit possible de configurer log4j pour Spring WebServices, mais enregistrera-t-il toutes les valeurs qui m'intéressent? http://pijava.wordpress.com/2009/12/04/spring-webservice-soap-requestresponse-logging-with-log4j/

EDIT: Nous utilisons actuellement SLF4J, ne pas Log4j. En outre, il semble qu'il soit possible de le faire en configurant PayloadLoggingInterceptor: http://static.springsource.org/spring-ws/site/reference/html/server.html#server-endpoint-interceptor =

Mais je ne sais pas où iront les messages du journal. J'ai ajouté cet intercepteur à nos intercepteurs et je ne vois aucun message de journal.

39
Nate Reed

Pour Spring Boot projet ajouté ci-dessous dans application.properties a fonctionné pour moi:

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
51
Arpit

Vous pouvez l'utiliser pour enregistrer le paylod brut des appels de service Web entrants et sortants. Je ne sais pas comment enregistrer combien de temps la communication du service Web a pris.

   <!-- Spring Web Service Payload Logging-->
   <logger name="org.springframework.ws.client.MessageTracing">
    <level value="TRACE"/> 
   </logger>
   <logger name="org.springframework.ws.server.MessageTracing">
    <level value="TRACE"/> 
   </logger>

Des détails supplémentaires peuvent être trouvés sur http://static.springsource.org/spring-ws/site/reference/html/common.html#logging

41
JustinKSU

Cela a fonctionné pour moi. Il enregistre le message de demande envoyé et la réponse reçue. Vous pouvez calculer le temps total pris dans le journal.

log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
21
Abhi Rampal

Si vous avez votre propre système de journalisation, l'intercepteur suivant peut être une alternative pour consigner les messages 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;
        }
    }});

Dans chaque méthode de handle, vous pouvez facilement utiliser payload pour obtenir des messages de savon bruts.

9
Iman

Tout d'abord, SLF4J n'est qu'une simple façade. Cela signifie que vous avez toujours besoin d'une infrastructure de journalisation (par exemple, Java.util.logging, logback, log4j).

Deuxièmement, Spring-ws utilise l'interface Commons Logging qui est une autre façade simple comme SLF4J.

Enfin, vous pouvez utiliser le paramètre ci-dessous pour activer la fonctionnalité de journalisation des messages 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
8
E.L.

Incluez les éléments suivants dans le log4j.properties fichier...

  1. Pour enregistrer tous les messages côté serveur: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. Pour consigner tous les messages côté client: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE

Au niveau DEBUG - seul l'élément racine de la charge utile est enregistré

Au niveau TRACE - tout le contenu du message est enregistré

Enfin, pour enregistrer uniquement les messages envoyés ou reçus, utilisez le .sent ou .received à la fin des configurations.

ex: log4j.logger.org.springframework.ws.server.MessageTracing.received=DEBUG enregistre l'élément racine de la charge utile des massages reçus côté client renvoyant:

DEBUG WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [org.springframework.ws.transport.http.HttpServletConnection@51ad62d9] to [http://localhost:8080/mock-platform/services]

Pour plus info

5
Shanaka Jayalath

Ajoutez un filtre de servlet au printemps ws (pour déplacer avec org.springframework.web.servlet.DispatcherServlet) dans web.xml

vous pouvez trouver un filtre ici http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

à l'intérieur du filtre, vous pouvez vous connecter comme vous le souhaitez

2
Supun Sameera