2012-03-13 93 views
8

我使用Apache xmlrpc構建了一個Java的xmlrpc客戶端,但無法弄清楚如何記錄輸入/輸出xml(接收和發送的原始數據)。我該怎麼做呢?在Apache xmlrpc客戶端記錄輸入/輸出xml

謝謝

+0

什麼日誌框架,你用? – 2012-03-13 08:53:09

+0

沒有框架,實際上我只需要一些簡單的東西,能夠讀取傳入和傳出的xml – ndriks 2012-03-13 13:44:31

回答

12

我的工作,各地情況如下使用自定義的運輸。也許有更多優雅的方式來做到這一點。

import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.apache.xmlrpc.XmlRpcException; 
import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcStreamTransport; 
import org.apache.xmlrpc.client.XmlRpcSunHttpTransport; 
import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; 
import org.xml.sax.SAXException; 


/** 
* This is a custom XML-RPC transport which logs the outgoing and incoming 
* XML-RPC messages. 
*/ 
public class MessageLoggingTransport extends XmlRpcSunHttpTransport 
{ 
    private static final Logger log = Logger.getLogger(MessageLoggingTransport.class.getName()); 


    /** 
    * Default constructor 
    * 
    * @see XmlRpcSunHttpTransport#XmlRpcSunHttpTransport(XmlRpcClient) 
    * @param pClient 
    */ 
    public CookieHandlingTransport(final XmlRpcClient pClient) 
    { 
     super(pClient); 
    } 


    /** 
    * Dumps outgoing XML-RPC requests to the log 
    */ 
    @Override 
    protected void writeRequest(final XmlRpcStreamTransport.ReqWriter pWriter) throws IOException, XmlRpcException, SAXException 
    { 
     final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     pWriter.write(baos); 
     log.info(baos.toString()); 
     super.writeRequest(pWriter); 
    } 


    /** 
    * Dumps incoming XML-RPC responses to the log 
    */ 
    @Override 
    protected Object readResponse(XmlRpcStreamRequestConfig pConfig, InputStream pStream) throws XmlRpcException 
    { 
     final StringBuffer sb = new StringBuffer(); 

     try 
     { 
      final BufferedReader reader = new BufferedReader(new InputStreamReader(pStream)); 
      String line = reader.readLine(); 
      while(line != null) 
      { 
       sb.append(line); 
       line = reader.readLine(); 
      } 
     } 
     catch(final IOException e) 
     { 
      log.log(Level.SEVERE, "While reading server response", e); 
     } 

     log.info(sb.toString()); 

     final ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes()); 
     return super.readResponse(pConfig, bais); 
    } 
} 

然後在其中創建的XML-RPC客戶端代碼:

final XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); 
config.setServerURL(new URL(url)); 

final XmlRpcTransportFactory transportFactory = new XmlRpcTransportFactory() 
{ 
    public XmlRpcTransport getTransport() 
    { 
     return new MessageLoggingTransport(client); 
    } 
}; 

client = new XmlRpcClient(); 
client.setTransportFactory(transportFactory); 
client.setConfig(config); 
0

嘗試使用記錄儀org.apache.xmlrpc.client;我敢打賭它會在該軟件包的某處吐出xml。嘗試是這樣的:

<appender name="LOG_FILE" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="Threshold" value="DEBUG"/> 
    <param name="File" value="C:\xmlrpc_client.log"/> 
    <param name="datePattern" value="'.'yyyy-ww" /> 
    <param name="Append" value="true"/> 
      <layout class="org.apache.log4j.PatternLayout"> 
       <param name="ConversionPattern" value="[%p] %t %d{DATE} %M - %m%n"/> 
      </layout> 
    </appender> 

    <logger name="org.apache.xmlrpc.client"> 
    <level value="DEBUG"/> 
</logger> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LOG_FILE"/> 
    </root> 
+0

對不起,但我不明白。這是什麼樣的xml?赦免新手:D – ndriks 2012-03-13 13:46:42

+0

嗨,不用擔心,但是當你說'登錄'時,我以爲你已經在使用log4j了。在這種情況下,如果你開始使用log4j,設置起來非常簡單,可以使用上面的log4j.xml配置,並且包org.apache.xmlrpc.client下的所有類都會記錄他們的東西,我敢打賭其中的一個類,大概XmlRpcClient會記錄它發送的xml和它接收到的xml – 2012-03-14 01:46:43

+3

@ CarlosJaimeC.DeLeon,我試過了,但顯然沒有記錄到該記錄器上。 – 2012-04-08 21:34:55