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.
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
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
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
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.
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
Incluez les éléments suivants dans le log4j.properties
fichier...
log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
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
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