2012-09-28 13 views
13

Tôi đang gặp sự cố tiếp theo:Làm cách nào để đăng nhập với yêu cầu và phản hồi của Log4J SOAP trong AXIS 1.x?

Tôi muốn ghi nhật ký các yêu cầu/phản hồi SOAP trên dịch vụ web của tôi (phía máy chủ). Đang cố gắng định cấu hình dịch vụ web của tôi trong tệp wsdd. Tôi luôn luôn hạ cánh trên các trang như sau một:

How to use the org.apache.axis.handlers.LogHandler

Những khuyến cáo để cấu hình Apeche Axis LogHandler để đăng nhập các request/response. Điều đó không hợp lệ đối với tôi, vì a) không có cách nào để liên kết log4j ở đó, và b) Tôi không thể làm cho nó hoạt động được.

Có ai biết cách làm cho log4j của tôi đăng nhập yêu cầu/phản hồi không?

Trả lời

31

Vì vậy, sau giờ làm việc hoặc Googling trên web, tôi quyết định phiêu lưu và lập trình xử lý của riêng mình. Dễ dàng hơn nhiều so với dự kiến.

Tôi đã tạo một lớp mở rộng lớp trừu tượng BasicHandler (org.apache.axis.handlers.BasicHandler) và triển khai phương thức gọi để ghi lại yêu cầu hoặc phản hồi. Đây là lớp học của tôi, mà tôi đã chịu phép báp têm như SOAPLogHandler:

package com.mypackage.axishandlers; 

import org.apache.axis.AxisFault; 
import org.apache.axis.MessageContext; 
import org.apache.axis.handlers.BasicHandler; 
import org.apache.log4j.Logger; 

public class SOAPLogHandler extends BasicHandler { 

private static Logger LOG= Logger.getLogger(SOAPLogHandler.class); 
private static final long serialVersionUID = 1L; 

@Override 
public void invoke(MessageContext msgContext) throws AxisFault { 
    if(msgContext.getResponseMessage() != null && msgContext.getResponseMessage().getSOAPPart() != null) { 
     LOG.info(" Response = " + msgContext.getResponseMessage().getSOAPPartAsString()); 
    } else { 
     if(msgContext.getRequestMessage() != null && msgContext.getRequestMessage().getSOAPPartAsString() != null) { 
      LOG.info(" Request = " + msgContext.getRequestMessage().getSOAPPartAsString()); 
     }  
    } 
} } 

Ý tưởng là, để ghi lại yêu cầu đầu tiên, và khi được xử lý, ghi lại phản hồi. Vì vậy, trong máy chủ -config.wsdd (hoặc tệp wsdd từ máy khách của bạn nếu bạn ở phía máy khách), chúng tôi phải thêm một trình xử lý trỏ đến lớp đó và định cấu hình để sử dụng trong chuỗi yêu cầu/phản hồi :

1st thêm handler

<handler name="log" type="java:com.mypackage.axishandlers.SOAPLogHandler"/> 

2nd thêm việc sử dụng các handler đó để yêu cầu/phản hồi từ việc vận chuyển http (tập trung vào xử lý log)

<transport name="http"> 
    <requestFlow> 
    <handler type="log"/> 
    <handler type="URLMapper"/> 
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> 
    </requestFlow> 
    <responseFlow> 
    <handler type="log"/> 
    </responseFlow> 
... 
</transport> 

Cùng với đó, ma thuật nên được thực hiện, và bạn sẽ nhận được một khá đăng nhập từ yêu cầu/phản hồi!

Tuyên bố từ chối trách nhiệm: Tôi không thực sự chắc chắn từ những gì sẽ xảy ra nếu bạn sử dụng một số loại điều SOAP đa.

+0

Tôi thấy bài đăng của bạn rất hữu ích. Tôi đang gặp khó khăn trong việc nhận phản hồi XML. Tôi có thể nhận được yêu cầu nhưng phản ứng SOAP không nhận được, phương thức invact infact chỉ gọi ở giai đoạn yêu cầu. Tôi đã làm tất cả cấu hình được đề xuất.Ngoài ra, khi tôi thêm các mục trong cấu hình chung cho yêu cầu và phản hồi thì chỉ tôi nhận được cả yêu cầu và phản hồi nhưng bên trong thẻ vận chuyển, tôi chỉ nhận được yêu cầu và không có phản hồi. – Jayesh

+0

Tôi đang sử dụng TestNG và Selenium. Tôi nên thêm người xử lý ở đâu? Trong tệp pom.xml hoặc TestNG.xml? – R11G

+0

Tôi thấy câu trả lời này rất hữu ích nhưng với điều này tôi không thể đăng nhập soapfault (ngoại lệ). Xin vui lòng đề nghị một cách để làm như vậy.Tôi có lỗiFlow tag nhưng nó không hoạt động –

14

Lưu tệp này dưới dạng "client-config.wsdd" trong thư mục làm việc như bạn làm cho log4j.properties.

Nếu bạn không muốn thay đổi bất kỳ mã nào và gỡ lỗi ứng dụng khách dịch vụ web trục của mình, bạn có thể làm theo phương pháp này để ghi nhật ký tất cả các tin nhắn đến và đi.

<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

<handler name="log" type="java:org.apache.axis.handlers.LogHandler" > 
    <parameter name="LogHandler.fileName" value="c:/logs/axis.log"/> 
</handler> 

<globalConfiguration> 
    <requestFlow> 
     <handler type="log" /> 
    </requestFlow> 
    <responseFlow> 
     <handler type="log" /> 
    </responseFlow> 
</globalConfiguration> 

<transport name="http" 
    pivot="java:org.apache.axis.transport.http.HTTPSender" /> 

</deployment> 
+0

Gặp vấn đề này khi xử lý sự cố ColdFusion 11 cài đặt đã được gọi .NET WebServices, và tiếp tục nhận được "java.net.ConnectException: Kết nối từ chối". Điều này đã giúp tôi theo dõi nó đến một không gian tên mặc định sai trong phong bì SOAP. (nó sử dụng "mx.webservices"). – TomEberhard

1

Trục theo mặc định là kiểm tra tệp client-config.wsdd. Chúng ta cần giữ tệp này ở vị trí giống như log4j.xml hoặc log4j.properties. Tệp nhật ký sẽ được tạo tại vị trí được chỉ định trên trình ghi nhật ký. Đảm bảo cấu trúc thư mục tồn tại.

mukesh

+0

Không biết về hành vi mặc định đó. Cảm ơn bạn về thông tin! – raspayu

8

Bạn cần phải thêm một logger Axis trong tập tin cấu hình log4.xml của bạn, như dưới đây:

<logger name="org.apache.axis.transport.http.HTTPSender"> 
    <level value="DEBUG"/> 
    <appender-ref ref="someLogAppender"/> 
</logger> 

someLogAppender có thể là một appender Log4J hiện có, hoặc bạn có thể muốn xác định một chuyên dụng, như bên dưới:

<appender name="someLogAppender" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="/my/path/to/axis.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p [%c] %m%n" /> 
    </layout> 
</appender> 
+0

Khởi động mùa xuân: Chỉ cần thêm 'logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG' vào tệp application.properties – CelinHC

4

Tôi biết một chủ đề cũ nhưng có thể hữu ích cho những người đang tìm kiếm câu trả lời.

Đối với ghi nhật ký phía máy chủ AXIS-1, hãy cập nhật server-config.wsdd như dưới đây. server-config.wsdd là dưới WEB-INF thư mục của tệp chiến tranh của bạn.

Trình xử lý mới cho nhật ký. Tên tệp cùng với đường dẫn có thể định cấu hình được.

<handler name="log" type="java:org.apache.axis.handlers.LogHandler"> 
    <parameter name="LogHandler.fileName" value="/tmp/req-res-axis.log" /> 
</handler> 

Bạn cũng có thể sử dụng tham số LogHandler.writeToConsole với giá trị như "true" để đăng nhập vào giao diện điều khiển đăng nhập của bạn.

Sau đó cập nhật phần <globalConfiguration>

<requestFlow> 
<handler type="log"/>   
</requestFlow> 
<responseFlow> 
<handler type="log"/> 
</responseFlow> 

Nếu requestFlowresponseFlow chứa bộ xử lý khác, đưa các bản ghi như xử lý đầu tiên.

Điều này chỉ nên được sử dụng cho mục đích gỡ lỗi không cho sản xuất. Kể từ khi đăng nhập là ngây thơ và làm các hoạt động ghi bình thường trên tập tin mà không có bất kỳ bộ đệm. Thứ hai, tệp nhật ký sẽ phát triển thành GB vì không có cơ chế di chuột qua.

Đối với ghi nhật ký phía máy khách AXIS-1, hãy cập nhật client-config.wsdd như dưới đây. Các client-config.wsdd nên đi vào classpath của bạn trực tiếp dưới một thư mục gốc được cấu hình trong classpath không có trong bất kỳ thư mục con nào. Vị trí tốt nhất là cùng một thư mục có tệp log4j.xml hoặc log4j.properties của bạn (Cảm ơn #MukeshKoshyM đăng ở trên).

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

    <handler name="log" type="java:org.apache.axis.handlers.LogHandler" > 
    <parameter name="LogHandler.fileName" value="/tmp/axis_req_res.log"/> 
    </handler> 

    <globalConfiguration> 
     <requestFlow> 
     <handler type="log" /> 
    </requestFlow> 
    <responseFlow> 
     <handler type="log" /> 
    </responseFlow> 
    </globalConfiguration> 

<transport name="http" 
    pivot="java:org.apache.axis.transport.http.HTTPSender" /> 
</deployment> 

Cùng một vấn đề được đề cập cho ghi nhật ký phía máy chủ cũng được áp dụng cho phía máy khách.

Để sản xuất, hãy viết trình xử lý nhật ký của riêng bạn bằng cách mở rộng org.apache.axis.handlers.BasicHandler và định cấu hình tệp lớp trong trình xử lý. Vui lòng xem câu trả lời ở trên từ #raspayu để định cấu hình của riêng bạn. Để đăng nhập các lỗi, hãy ghi đè phương thức public void onFault(MessageContext msgContext) trong Trình xử lý của bạn.

2

Một giải pháp để đăng nhập Lỗi Axis là mở rộng phương pháp OnFault:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.apache.axis.AxisFault; 
import org.apache.axis.MessageContext; 
import org.apache.axis.handlers.BasicHandler; 

public class SOAPLogHandler extends BasicHandler { 

    private static final String AXIS = "AXIS"; 
    private static final String AXIS_FAULT = "AXIS FAULT"; 
    private static Logger LOG = LoggerFactory.getLogger(SOAPLogHandler.class); 
    private static final long serialVersionUID = 1; 

    @Override 
    public void invoke(MessageContext msgContext) throws AxisFault { 
    logMessage(AXIS, msgContext); 
    } 

    @Override 
    public void onFault(MessageContext msgContext) { 
    try {    
     logMessage(AXIS_FAULT,msgContext); 
    } catch (AxisFault axisFault) { 
     LOG.error("Error on logging messages ",axisFault); 
    } 
    } 

    private void logMessage(String preamble, MessageContext msgContext) throws AxisFault { 
    if (msgContext.getResponseMessage() != null && msgContext.getResponseMessage().getSOAPPart() != null) { 
     LOG.info("{} Response ={}",preamble ,msgContext.getResponseMessage().getSOAPPartAsString()); 
     return; 
    } 

    if (msgContext.getRequestMessage() != null && msgContext.getRequestMessage().getSOAPPartAsString() != null) { 
     LOG.info("{} Request={}",preamble,msgContext.getRequestMessage().getSOAPPartAsString()); 
    } 
    } 
} 

Nó cũng là bắt buộc để thiết lập các điều khiển trong dòng chảy yêu cầu cấu hình toàn cầu, trong file wsdd sẽ được cái gì như thế này:

<globalConfiguration>  
    <requestFlow> 
    <handler type="log" /> 
    </requestFlow> 
    <responseFlow> 
    <handler type="log" /> 
    </responseFlow> 
</globalConfiguration> 

<handler name="log" type="java:your.package.SOAPLogHandler"/>