복붙노트

[SPRING] 스프링 웹 서비스가 모든 SOAP 요청을 기록하게하려면 어떻게해야합니까?

SPRING

스프링 웹 서비스가 모든 SOAP 요청을 기록하게하려면 어떻게해야합니까?

CommonLogFormat (http://en.wikipedia.org/wiki/Common_Log_Format 참조)에 기록 된 모든 SOAP 요청과 지속 시간 (요청을 처리하는 데 걸리는 시간)이 필요합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? Spring WebServices 용 log4j를 구성 할 수있는 것처럼 보이지만 관심있는 모든 값을 기록 할 것인가? http://pijava.wordpress.com/2009/12/04/spring-webservice-soap-requestresponse-logging-with-log4j/

편집 : 우리는 실제로 Log4j 아니라 SLF4J 사용하고 있습니다. 또한 PayloadLoggingInterceptor를 구성하여이 작업을 수행 할 수있는 것처럼 보입니다. http://static.springsource.org/spring-ws/site/reference/html/server.html#server-endpoint-interceptor

그러나 로그 메시지의 위치를 ​​알 수는 없습니다. 그 인터셉터를 인터셉터에 추가했는데 로그 메시지가 보이지 않습니다.

해결법

  1. ==============================

    1.Spring 부팅 프로젝트의 경우 아래 application.properties 파일을 추가하면 저에게 효과적입니다.

    Spring 부팅 프로젝트의 경우 아래 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
    
  2. ==============================

    2.들어오고 나가는 웹 서비스 호출의 원시 페이로드를 로깅하는 데 사용할 수 있습니다. 웹 서비스 통신 도구의 시간을 기록하는 방법을 잘 모르겠습니다.

    들어오고 나가는 웹 서비스 호출의 원시 페이로드를 로깅하는 데 사용할 수 있습니다. 웹 서비스 통신 도구의 시간을 기록하는 방법을 잘 모르겠습니다.

       <!-- 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에서 확인할 수 있습니다.

  3. ==============================

    3.이것은 나를 위해 일했다. 보낸 요청 메시지와 수신 된 응답을 기록합니다. 로그에서 취한 총 시간을 계산할 수 있습니다.

    이것은 나를 위해 일했다. 보낸 요청 메시지와 수신 된 응답을 기록합니다. 로그에서 취한 총 시간을 계산할 수 있습니다.

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

    4.첫째, SLF4J는 단순한 외관입니다. 즉, 여전히 로깅 프레임 워크가 필요합니다 (예 : java.util.logging, logback, log4j).

    첫째, SLF4J는 단순한 외관입니다. 즉, 여전히 로깅 프레임 워크가 필요합니다 (예 : java.util.logging, logback, log4j).

    둘째, Spring-ws는 SLF4J와 같은 또 다른 간단한 외관 인 Commons Logging 인터페이스를 사용한다.

    마지막으로, 아래 설정을 사용하여 Spring-w 메시지 로깅 기능을 활성화 할 수 있습니다.

    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
    
  5. ==============================

    5.log4j.properties 파일에 다음을 포함 시키십시오 ...

    log4j.properties 파일에 다음을 포함 시키십시오 ...

    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]
    

    더 많은 정보를 위해서

  6. ==============================

    6.독자적인 로깅 시스템을 가지고 있다면 SOAP 메시지를 로깅하는 대신 다음 인터셉터를 사용할 수 있습니다.

    독자적인 로깅 시스템을 가지고 있다면 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;
            }
        }});
    

    각 핸들 메소드에서 페이로드를 사용하여 원시 비누 메시지를 쉽게 얻을 수 있습니다.

  7. ==============================

    7.web.xml에서 스프링 ws (org.springframework.web.servlet.DispatcherServlet으로 이동)에 서블릿 필터를 추가하십시오.

    web.xml에서 스프링 ws (org.springframework.web.servlet.DispatcherServlet으로 이동)에 서블릿 필터를 추가하십시오.

    여기에서 필터를 찾을 수 있습니다. http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

    필터 안에 원하는대로 로그 할 수 있습니다.

  8. from https://stackoverflow.com/questions/7109251/how-can-i-make-spring-webservices-log-all-soap-requests by cc-by-sa and MIT license