2011-08-18 78 views
25

我需要在CommonLogFormat(请参阅http://en.wikipedia.org/wiki/Common_Log_Format)中记录的所有SOAP请求以及持续时间(处理请求所用的时间量)。如何让Spring WebServices记录所有的SOAP请求?

这样做的最好方法是什么?看起来可以为Spring WebServices配置log4j,但会记录下我感兴趣的所有值吗? http://pijava.wordpress.com/2009/12/04/spring-webservice-soap-requestresponse-logging-with-log4j/

编辑:我们实际上使用SLF4J而不是Log4j。另外,看起来可以通过配置PayloadLoggingInterceptor来实现: http://static.springsource.org/spring-ws/site/reference/html/server.html#server-endpoint-interceptor

但是我不确定日志消息的去向。我向拦截器添加了拦截器,但没有看到任何日志消息。

回答

29

您可以使用它来记录传入和传出Web服务调用的原始支付。我不确定如何记录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> 

其他细节可以在http://static.springsource.org/spring-ws/site/reference/html/common.html#logging

+0

我无法在spring-ws中找到这些类1.5.9 – wytten

+4

它们不是类,它们是记录到的类。请参阅http://static.springsource.org/spring-ws/site/reference/html/common.html#logging – JustinKSU

+0

PayloadLoggingInterceptor也可能有所帮助。原始海报添加了一个链接。 – JustinKSU

16

这为我工作中找到。它记录发送的请求消息和收到的响应。您可以计算从日志中花费的总时间。

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

显然,应该将其添加到您的log4j.properties文件中。 –

7

首先,SLF4J只是一个简单的外观。这意味着你仍然需要一个日志框架(例如java.util.logging,logback,log4j)。其次,Spring-ws使用Commons Logging接口,这是另一种简单的外观,如SLF4J。

最后,您可以使用下面的设置来启用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

这对我有用。谢谢。有人知道如何在日志中打印SOAP吗? – theINtoy

5

包括在log4j.properties文件中的下列...

  1. 要记录所有的服务器端的消息: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. 要记录所有客户端的消息: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE

DEBUG水平 - 只有有效负载根元素被记录

TRACE级别 - 记录整个邮件内容

最后只记录发送或接收的邮件使用.sent.received在配置结束时。

例如:log4j.logger.org.springframework.ws.server.MessageTracing.received=DEBUG 登录客户端收到按摩有效载荷根元素 返回:

DEBUG WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [org.springframework.ws.trans[email protected]] to [http://localhost:8080/mock-platform/services] 

更多info

25

对于春季启动项目将低于application.properties工作对我来说:

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

如果您有自己的日志记录系统,则以下拦截器可以替代记录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; 
     } 
    }}); 

在可以很容易地使用​​得到粗SOAP消息每个把手方法。