すべての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 =
しかし、ログメッセージがどこに行くのかわかりません。そのインターセプターをインターセプターに追加しましたが、ログメッセージは表示されません。
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
これを使用して、着信および発信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 にあります。
これは私のために働いた。送信された要求メッセージと受信された応答を記録します。ログから取得した合計時間を計算できます。
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
独自のログシステムがある場合は、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メッセージを簡単に取得できます。
まず、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
log4j.properties
ファイルに次を含めます...
log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
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
Web.xmlで(org.springframework.web.servlet.DispatcherServletと一緒に移動するために)スプリングフィルターにサーブレットフィルターを追加します。
ここでフィルタを見つけることができます http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431
フィルタ内では、必要に応じてログを記録できます