如何让Spring Web Services记录所有SOAP请求?

时间:2011-08-18 14:40:13

标签: java spring web-services spring-mvc soap

我需要记录CommonLogFormat中的所有SOAP请求(请参阅http://en.wikipedia.org/wiki/Common_Log_Format),以及持续时间(处理请求所需的时间)。

最好的方法是什么?看起来可以为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

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

7 个答案:

答案 0 :(得分:46)

对于application.properties下面添加的 Spring Boot 项目,为我工作:

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 :(得分:37)

您可以使用它来记录传入和传出Web服务调用的原始支付。我不确定如何记录Web服务通信所花费的时间。

   <!-- 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>

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

找到

答案 2 :(得分:21)

这对我有用。它记录发送的请求消息和收到的响应。您可以计算从日志中获取的总时间。

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

答案 3 :(得分:8)

首先,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

答案 4 :(得分:7)

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

在每个句柄方法中,您可以轻松使用payload获取原始肥皂消息。

答案 5 :(得分:5)

log4j.properties文件中包含以下内容...

  1. 要记录所有服务器端消息: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. 要记录所有客户端消息: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE
  3. DEBUG级别 - 仅记录有效负载根元素

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

    最后,要仅记录已发送或已接收的消息,请使用配置末尾的.sent.received

    ex:log4j.logger.org.springframework.ws.server.MessageTracing.received=DEBUG 记录客户端接收的按摩有效负载根元素 回来:

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

    了解更多info

答案 6 :(得分:2)

在web.xml中添加一个servlet过滤器到spring ws(与org.springframework.web.servlet.DispatcherServlet一起移动)

你可以在这里找到一个过滤器 http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

在过滤器内,您可以根据需要进行记录