2011-08-18 31 views
25

Tôi cần tất cả các yêu cầu SOAP được đăng nhập trong CommonLogFormat (xem http://en.wikipedia.org/wiki/Common_Log_Format), cộng với thời lượng (khoảng thời gian cần để xử lý yêu cầu).Làm thế nào tôi có thể làm cho Spring WebServices ghi lại tất cả các yêu cầu SOAP?

Cách tốt nhất để làm điều này là gì? Có vẻ như có thể cấu hình log4j cho Spring WebServices nhưng nó sẽ ghi lại tất cả các giá trị mà tôi quan tâm? http://pijava.wordpress.com/2009/12/04/spring-webservice-soap-requestresponse-logging-with-log4j/

EDIT: Chúng tôi đang thực sự sử dụng SLF4J, không phải Log4j. Ngoài ra, có vẻ như có thể thực hiện việc này bằng cách định cấu hình PayloadLoggingInterceptor: http://static.springsource.org/spring-ws/site/reference/html/server.html#server-endpoint-interceptor

Nhưng tôi không chắc chắn thông báo tường trình sẽ xuất hiện ở đâu. Tôi đã thêm máy đánh chặn đó vào máy đánh chặn của chúng tôi và tôi không thấy bất kỳ thông điệp tường trình nào.

Trả lời

29

Bạn có thể sử dụng tính năng này để đăng nhập paylod thô của các cuộc gọi dịch vụ web đến và đi .. Tôi không chắc chắn cách ghi lại thời gian liên lạc webservice mất.

<!-- Spring Webservice XML --> 
    <logger name="org.springframework.ws.client.MessageTracing"> 
    <level value="TRACE"/> 
    </logger> 
    <logger name="org.springframework.ws.server.MessageTracing"> 
    <level value="TRACE"/> 
    </logger> 

chi tiết bổ sung có thể được tìm thấy tại http://static.springsource.org/spring-ws/site/reference/html/common.html#logging

+0

Tôi không thể tìm thấy các lớp này trong spring-ws 1.5.9 – wytten

+4

Chúng không phải là lớp học, chúng là các danh mục được đăng nhập. Xem tài liệu tại http://static.springsource.org/spring-ws/site/reference/html/common.html#logging – JustinKSU

+0

PayloadLoggingInterceptor cũng có thể hữu ích. Áp phích gốc đã thêm liên kết vào nó. – JustinKSU

16

này đã làm việc cho tôi. Nó ghi lại thông báo yêu cầu được gửi và phản hồi nhận được. Bạn có thể tính toán tổng thời gian lấy từ nhật ký.

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

Rõ ràng, cần được thêm vào tệp log4j.properties của bạn. –

7

Đầu tiên, SLF4J chỉ là một mặt tiền đơn giản. Điều đó có nghĩa là bạn vẫn cần một khung ghi nhật ký (ví dụ: java.util.logging, logback, log4j).

Thứ hai, Spring-ws sử dụng giao diện Ghi nhật ký giao diện là một mặt tiền đơn giản khác như SLF4J.

Cuối cùng, bạn có thể sử dụng cài đặt bên dưới để bật chức năng ghi nhật ký thư của 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 
+2

Điều này làm việc cho tôi. Cảm ơn. Có ai biết làm thế nào để in đẹp SOAP trong các bản ghi? – theINtoy

5

Bao gồm những điều sau trong tệp log4j.properties ...

  1. Để đăng nhập tất cả các thư server-side: log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
  2. Để đăng nhập tất cả các thư client-side: log4j.logger.org.springframework.ws.client.MessageTracing=TRACE

Ở cấp độ DEBUG - chỉ phần tử gốc tải trọng được đăng nhập

Trên TRACE cấp - toàn bộ nội dung thư được ghi lại

Cuối cùng chỉ ghi nhật ký thư đã gửi hoặc đã nhận sử dụng .sent hoặc .received ở cuối cấu hình.

ví dụ: log4j.logger.org.springframework.ws.server.MessageTracing.received=DEBUG ghi lại client-side nhận yếu tố massage tải trọng gốc trở về:

DEBUG WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [[email protected]62d9] to [http://localhost:8080/mock-platform/services] 

Để biết thêm info

25

Đối dự án Spring Boot thêm dưới đây trong application.properties làm việc cho tôi:

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 
1

Nếu bạn có hệ thống Ghi nhật ký riêng của mình, trình chặn chặn sau có thể là một thay thế để ghi nhật ký các thông báo 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; 
     } 
    }}); 

Trong mỗi phương pháp xử lý, bạn có thể dễ dàng sử dụng payload để nhận thông báo xà phòng thô.

Các vấn đề liên quan