2012-03-13 22 views
8

Estoy compilando un cliente xmlrpc con Java usando Apache xmlrpc, pero no pude encontrar la forma de registrar el xml de entrada/salida (los datos brutos recibidos y enviados). ¿Cómo hago esto?logging entrada/salida xml en apache xmlrpc client

Gracias

+0

marco Lo tala utiliza? –

+0

sin marco, solo necesito algo realmente simple, para poder leer el xml entrante y saliente – ndriks

Respuesta

12

Mi solución fue utilizar un transporte personalizado de la siguiente manera. Tal vez hay formas más elegantes de hacer esto.

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); 
    } 
} 

Y luego en el código que crea su cliente 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

Trate de usar un registrador para org.apache.xmlrpc.client; Apuesto a que escupiría el xml en algún lugar de ese paquete. Pruebe algo como esto:

<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

Lo siento, pero no entiendo. ¿Qué tipo de xml es esto? perdón por la condición de novato: D – ndriks

+0

Hola, no te preocupes, pero cuando dijiste 'iniciar sesión', pensé que ya estabas usando log4j. En este caso, si empiezas a usar log4j, muy fácil de configurar, usa la configuración anterior para log4j.xml y todas las clases bajo ese paquete org.apache.xmlrpc.client registrarían sus cosas, apuesto a que una de las clases allí, probablemente XmlRpcClient registrará el xml que envía y el xml que recibe –

+3

@ CarlosJaimeC.DeLeon, lo intenté, pero aparentemente no hay nada registrado en ese registrador. –