Spring Web Services가 모든 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
또한 Payload Logging을 구성하여 이 작업을 수행할 수 있을 것으로 보입니다.인터셉트: 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
이를 통해 들어오고 나가는 웹 서비스 호출의 원시 페이로드를 기록할 수 있습니다.웹 서비스 통신 시간을 기록하는 방법을 잘 모르겠습니다.
<!-- 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 에서 확인할 수 있습니다.
독자적인 로깅 시스템이 있는 경우 다음 인터셉터를 사용하여 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
원시 비누 메시지를 가져옵니다.
이것은 저에게 효과가 있었습니다.전송된 요청 메시지와 수신된 응답을 기록합니다.로그에서 소요된 총 시간을 계산할 수 있습니다.
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
먼저 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
level - 페이로드 루트 요소만 기록됩니다.
에서TRACE
level - 전체 메시지 내용이 기록됩니다.
마지막으로 보내거나 받은 메시지만 기록하려면 다음을 사용합니다..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]
자세한 내용은
. . .
package com.example.Soap;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class LoggingVonfig implements 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;
}
@Override
public void afterCompletion(MessageContext messageContext, Exception e) throws WebServiceClientException {
}
}
. . .
This is logging Configuration class
. . .
package com.example.Soap;
import com.example.Soap.com.example.Soap.Add;
import com.example.Soap.com.example.Soap.AddResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.soap.client.core.SoapActionCallback;
public class CalculatorClient extends WebServiceGatewaySupport {
private static Logger log = LoggerFactory.getLogger(CalculatorClient.class);
public com.example.Soap.com.example.Soap.AddResponse getaddition(com.example.Soap.com.example.Soap.Add addrequest){
com.example.Soap.com.example.Soap.Add add = new com.example.Soap.com.example.Soap.Add();
add.setIntB(addrequest.getIntB());
add.setIntA(addrequest.getIntA());
log.info("----------------------------------------------"+"Inbound Request"+"-----------------------");
com.example.Soap.com.example.Soap.AddResponse addResponse = (com.example.Soap.com.example.Soap.AddResponse) getWebServiceTemplate().marshalSendAndReceive("http://www.dneonline.com/calculator.asmx?wsdl",add,new SoapActionCallback("http://tempuri.org/Add"));
return addResponse;
}
public com.example.Soap.com.example.Soap.SubtractResponse getSubtract(com.example.Soap.com.example.Soap.Subtract subreq){
com.example.Soap.com.example.Soap.Subtract subtract=new com.example.Soap.com.example.Soap.Subtract();
subtract.setIntA(subreq.getIntA());
subtract.setIntB(subreq.getIntB());
com.example.Soap.com.example.Soap.SubtractResponse subtractResponse=(com.example.Soap.com.example.Soap.SubtractResponse) getWebServiceTemplate().marshalSendAndReceive("http://www.dneonline.com/calculator.asmx?wsdl",subtract,new SoapActionCallback("http://tempuri.org/Subtract"));
return subtractResponse;
}
public com.example.Soap.com.example.Soap.MultiplyResponse getMultiply(com.example.Soap.com.example.Soap.Multiply multiply)
{
com.example.Soap.com.example.Soap.Multiply multiply1=new com.example.Soap.com.example.Soap.Multiply();
multiply1.setIntA(multiply.getIntA());
multiply1.setIntB(multiply.getIntB());
com.example.Soap.com.example.Soap.MultiplyResponse multiplyResponse=(com.example.Soap.com.example.Soap.MultiplyResponse) getWebServiceTemplate().marshalSendAndReceive("http://www.dneonline.com/calculator.asmx?wsdl",multiply1,new SoapActionCallback("http://tempuri.org/Multiply"));
return multiplyResponse;
}
public com.example.Soap.com.example.Soap.DivideResponse getDivide(com.example.Soap.com.example.Soap.Divide divide){
com.example.Soap.com.example.Soap.Divide divide1=new com.example.Soap.com.example.Soap.Divide();
divide1.setIntA(divide.getIntA());
divide1.setIntB(divide.getIntB());
com.example.Soap.com.example.Soap.DivideResponse divideResponse=(com.example.Soap.com.example.Soap.DivideResponse) getWebServiceTemplate().marshalSendAndReceive("http://www.dneonline.com/calculator.asmx?wsdl",divide1,new SoapActionCallback("http://tempuri.org/Divide"));
return divideResponse;
}
public void MySoapClient() {
this.setInterceptors(new ClientInterceptor[] { new LoggingVonfig() });
}
}
. . .
This is my client class
. . .
package com.example.Soap;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.client.core.WebServiceTemplate;
@Configuration
public class CalculatorConfig {
@Bean
public Jaxb2Marshaller marshaller(){
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
// jaxb2Marshaller.setPackagesToScan("com.example.Soap.com.example.Soap");
jaxb2Marshaller.setContextPath("com.example.Soap.com.example.Soap"); // this will serilaize and unserialize it
return jaxb2Marshaller;
}
@Bean
public CalculatorClient calculatorClient(Jaxb2Marshaller jaxb2Marshaller){
WebServiceTemplate wsTemplate = new WebServiceTemplate();
CalculatorClient calculatorClient = new CalculatorClient();
calculatorClient.setDefaultUri("http://www.dneonline.com");
calculatorClient.setMarshaller(jaxb2Marshaller);
calculatorClient.setUnmarshaller(jaxb2Marshaller);
return calculatorClient;
}
}
. . .
configuration file
. . .
package com.example.Soap;
import com.example.Soap.com.example.Soap.Add;
import com.example.Soap.com.example.Soap.AddResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SoapApplication {
@Autowired
private CalculatorClient calculatorClient;
@PostMapping(value = "/add")
public com.example.Soap.com.example.Soap.AddResponse addelements(@RequestBody com.example.Soap.com.example.Soap.Add add){
return calculatorClient.getaddition(add);
}
@PostMapping(value = "/subtract")
public com.example.Soap.com.example.Soap.SubtractResponse addelements(@RequestBody com.example.Soap.com.example.Soap.Subtract subreq){
return calculatorClient.getSubtract(subreq);
}
@PostMapping(value = "/multiply")
public com.example.Soap.com.example.Soap.MultiplyResponse addelements(@RequestBody com.example.Soap.com.example.Soap.Multiply multiply){
return calculatorClient.getMultiply(multiply);
}
@PostMapping(value = "/divide")
public com.example.Soap.com.example.Soap.DivideResponse addelements(@RequestBody com.example.Soap.com.example.Soap.Divide divide){
return calculatorClient.getDivide(divide);
}
public static void main(String[] args) {
SpringApplication.run(SoapApplication.class, args);
}
}
. . .
이것들은 내 수업이지만 콘솔에 모든 요청과 응답을 기록할 수 없습니다.저는 제가 잘못한 부분을 이해하지 못하고 있습니다.클라이언트 구성도 구현했습니다.
가장 쉬운 방법은 보안 구성(securityPolicy.xml)에 속성을 추가하는 것입니다.
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true">
없음설 내부에 추가 이 없습니다.application.properties
필수의.
보안 정책 파일을 이해하려면 해당 링크를 선택합니다.
servlet 필터를 springws에 추가합니다(org.springframework와 함께 이동).웹.서블릿web.xml의 DispatcherServlet)
필터는 여기에서 찾을 수 있습니다. https://web.archive.org/web/20160317123724/http ://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431
필터 내부에서 원하는 대로 기록할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7109251/how-can-i-make-spring-webservices-log-all-soap-requests
'programing' 카테고리의 다른 글
JavaScript Regex를 사용하여 문자열을 추출하는 방법은 무엇입니까? (0) | 2023.07.29 |
---|---|
jQuery - 선택한 옵션에서 사용자 지정 특성 가져오기 (0) | 2023.07.29 |
XMLHttpRequest.open()을(를) 재정의합니다. (0) | 2023.07.29 |
미디어 쿼리가 화면 대신 div 요소를 기준으로 크기를 조정할 수 있습니까? (0) | 2023.07.29 |
SpringBoot에서 콩을 추가하는 방법시험 (0) | 2023.07.29 |