Logging de los mensajes SOAP con Axis

Cada vez es más común el uso de servicios web para la integración de aplicaciones web de todo tipo con sistemas de backend, que centralizan la autenticación y participación de los usuarios en dichas web. De esa forma, entre otras ventajas obvias, es posible utilizar software de tipo CRM en la parte del backend, y así extraer conclusiones estadísticas o realizar campañas enfocadas a segmentos concretos de usuarios.

Dentro de este contexto, os podéis encontrar en la necesidad de conectar vuestra aplicación con este tipo de servicios web. Como en todo proceso de integración, es vital saber cuándo y dónde se dan los errores. La mayoría de las incidencias se reportarán inicialmente como de la aplicación, puesto que es el frontal que ven los usuarios. Para identificar realmente de dónde vienen y cuál es la causa, lo mejor es hacer logging.

Como sabréis, existen varios motores de servicios web en Java, destacando Axis, Axis2 y CFX (antiguo XFire). Usando Axis y Log4J, obtener un fichero de log diario con todos los mensajes SOAP que la aplicación envía y recibe es tal fácil como configurar Log4J de la siguiente forma:

# Logger for Axis SOAP messages
# Set level DEBUG and point it to soap appender to make a log of all SOAP messages
log4j.logger.org.apache.axis.transport.http.HTTPSender=DEBUG, soap
log4j.additivity.org.apache.axis.transport.http.HTTPSender=false
 
# File roller for SOAP messages
log4j.appender.soap=org.apache.log4j.DailyRollingFileAppender
log4j.appender.soap.File=/var/log/projects/myapp/axis-http-soap.log
log4j.appender.soap.append=true
log4j.appender.soap.DatePattern='.'yyyy-MM-dd
log4j.appender.soap.layout=org.apache.log4j.PatternLayout
log4j.appender.soap.layout.ConversionPattern=%m%n

La clase HTTPSender de Axis hace debug de todos los mensajes SOAP, tanto cabecera como cuerpo, de entrada y de salida. Por lo tanto, configuramos su logger a ese nivel, DEBUG. Además, creamos un appender para el fichero de log que deseamos usar, que se renovará diariamente.
El truco para conseguir que todo este log no acabe también en el appender del logger raíz (que en producción debería estar a nivel INFO, como máximo, y destinado fundamentalmente a capturar errores) es desactivar la aditividad al logger de HTTPSender.

Así, por cada pareja de petición y respuesta SOAP, nos encontraremos algo como esto en el fichero de log:

Enter: HTTPSender::invoke XML sent:
---------------------------------------------------
POST /cfc/login.cfc HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.4 Host: javisjava.com Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 722
 
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:Login
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:ns1="http://cfc">
            <email xsi:type="xsd:string">usuario@dominio.com</email>
            <contrasena xsi:type="xsd:string">clave</contrasena>
        </ns1:Login>
    </soapenv:Body>
</soapenv:Envelope>
 
HTTP/1.1 200 OK Connection close Date Mon, 01 Sep 2008 10:29:12 GMT
Set-Cookie CFID=5303012;expires=Wed, 25-Aug-2038 10:29:12
GMT;path=/ Set-Cookie JSESSIONID=51851711;expires=Wed, 25-Aug-2018 10:59:21
GMT;path=/ Content-Type text/xml; charset=utf-8
no Content-Length
 
XML received:
-----------------------------------------------
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:LoginResponse
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:ns1="http://cfc">
            <LoginReturn xsi:type="xsd:double">112</LoginReturn>
        </ns1:LoginResponse>
    </soapenv:Body>
</soapenv:Envelope>
 
Exit: HTTPDispatchHandler::invoke


8 Comments to “Logging de los mensajes SOAP con Axis”  

  1. 1 Paco

    Acabo de terminar de leer tu Guía Práctica JSP y es una “pasada”. Enhorabuena.

  2. 2 Alonso

    Buenas, solo comentar que el jar de log4j debe ir en el /WEB-INF/lib del directorio axis para que funcione.

    Saludos

  3. 3 Sergio

    Hola, yo estoy intentando hacer que un cliente de WS basado en axis 1.4 me tracee los mensajes SOAP y no lo consigo (el fichero de trazas al que apunto aparece vacío). La única diferencia que veo respecto a lo que está publicado es que yo utilizo el fichero de configuración con formato xml:

    ¿Sabéis por qué no me funciona con esta configuración? Gracias!

  4. 4 Andres

    Tengo un cliente con axis y el problema que tengo es que no me levata el log4j.properties, no se si axis tiene uno por defoult o algo así que impida ver el mio.

    Muchas gracias
    Saludos

  5. 5 javier

    La distribución de Axis lleva uno por defecto junto a los JARs, pero si estuviera en tu aplicación te sería fácil encontrarlo y modificarlo. Asegúrate de que está situado en el raíz del classpath de la aplicación (si es web, en WEB-INF/classes).

    También pueden ser otras librerías que use tu aplicación. Hay unas cuantas que, efectivamente, vienen con configuración propia de Log4J, a veces incluso dentro de los JARs.

  6. 6 Clases java

    Muy buen post. Para debuguear y no romperse la cabeza con SOAP

    Saludos!

  7. 7 Eli

    Hola que tal, tengo una pequeña duda ojala me pudieran Ayudar.

    Quisiera imprimir en el response de un servlet el XML de mi respuesta de una consulta a un webservice, Estoy uisando AXIS, cuando consumo el servico lo hago mediante el Locator, el ResponseType, requestType y demas

    es posible generar el XML de respuesta, y mostrarlo en pantalla?

    Saludos y muchas gracias

  1. 1 links for 2010-07-28 « Java Asgaya


Leave a Reply