Как я могу заставить Spring WebServices регистрировать все запросы SOAP? - PullRequest
37 голосов
/ 18 августа 2011

Мне нужны все запросы SOAP, зарегистрированные в CommonLogFormat (см. http://en.wikipedia.org/wiki/Common_Log_Format), плюс продолжительность (количество времени, необходимое для обработки запроса).

Какой лучший способ сделатьэто похоже на то, что можно настроить log4j для Spring WebServices, но будут ли в него записываться все интересующие меня значения? 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 ]

48 голосов
/ 12 июня 2016

Для Spring Boot Проект добавления ниже в 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
38 голосов
/ 18 августа 2011

Вы можете использовать это для регистрации необработанного платежа за входящие и исходящие вызовы веб-службы. Я не знаю, как регистрировать, сколько времени заняло общение с веб-сервисом.

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

21 голосов
/ 12 июля 2013

Это сработало для меня. Он регистрирует отправленное сообщение-запрос и полученный ответ. Вы можете определить общее время, взятое из журнала.

log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
8 голосов
/ 11 мая 2014

Во-первых, 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
7 голосов
/ 28 февраля 2018

Если у вас есть собственная система ведения журнала, следующий перехватчик может быть альтернативой для записи сообщений 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 голосов
/ 24 июня 2015

Включите в файл log4j.properties следующее ...

  1. Для регистрации всех сообщений на стороне сервера: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. Для регистрации всех сообщений на стороне клиента: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE

На уровне 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

2 голосов
/ 09 августа 2014

Добавление фильтра сервлетов к пружине ws (для перемещения с помощью org.springframework.web.servlet.DispatcherServlet) в web.xml

Вы можете найти фильтр здесь http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

внутри фильтра вы можете войти, как вы хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...