web-dev-qa-db-ja.com

Spring WebサービスですべてのSOAPリクエストをログに記録するにはどうすればよいですか?

すべてのSOAP CommonLogFormatに記録されたリクエスト( 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 =

しかし、ログメッセージがどこに行くのかわかりません。そのインターセプターをインターセプターに追加しましたが、ログメッセージは表示されません。

39
Nate Reed

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

これを使用して、着信および発信Webサービスコールの未加工のPaylodを記録できます。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 にあります。

41
JustinKSU

これは私のために働いた。送信された要求メッセージと受信された応答を記録します。ログから取得した合計時間を計算できます。

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

独自のログシステムがある場合は、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を使用して生のSOAPメッセージを簡単に取得できます。

9
Iman

まず、SLF4Jは単なる外観です。つまり、ロギングフレームワーク(Java.util.logging、logback、log4jなど)が引き続き必要であることを意味します。

第二に、Spring-wsはSLF4Jのような別のシンプルなファサードであるCommons Loggingインターフェースを使用します。

最後に、以下の設定を使用して、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.

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.transport.http.HttpServletConnection@51ad62d9] to [http://localhost:8080/mock-platform/services]

詳細 info

5

Web.xmlで(org.springframework.web.servlet.DispatcherServletと一緒に移動するために)スプリングフィルターにサーブレットフィルターを追加します。

ここでフィルタを見つけることができます http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

フィルタ内では、必要に応じてログを記録できます

2
Supun Sameera