2012-09-28 26 views
13

Tengo el siguiente problema:¿Cómo puedo iniciar sesión con la solicitud y respuesta SOAP de Log4J en AXIS 1.x?

Quiero registrar las solicitudes/respuestas SOAP que llegan a mi servicio web (lado del servidor). Estoy tratando de configurar mi servicio web en el archivo wsdd. Siempre estoy aterrizando en las páginas como la siguiente:

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

que recomienda configurar el Apeche Eje LogHandler para registrar la petición/respuesta. Eso no es válido para mí, ya que a) no hay forma de vincular el log4j allí, yb) Simplemente no puedo hacerlo funcionar.

¿Alguien sabe una forma de hacer que mi log4j registre la solicitud/respuestas?

Respuesta

31

Así que después de horas o buscando en Google en la web, decidí ser aventurero y programar mi propio controlador. Es mucho más fácil de lo esperado.

Hice una clase que amplía la clase abstracta BasicHandler (org.apache.axis.handlers.BasicHandler) e implementa el método de invocación que registra la solicitud o la respuesta. Aquí es mi clase, que yo he bautizado como 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()); 
     }  
    } 
} } 

La idea es, para registrar primero la solicitud, y cuando son procesadas, ingrese la respuesta. Entonces, en el server-config.wsdd (o el archivo wsdd de su cliente si está en el lado del cliente), tenemos que agregar un controlador que apunte a esa clase y configurarlo para que se use en la cadena de solicitud/respuesta :

primero agregar el controlador

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

segundo añadir el uso de ese manejador a la petición/respuesta del transporte HTTP (se centran en el manejador de registro)

<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> 

con ello, la se debe hacer magia, y deberías recibir un bastante registro de la solicitud/respuestas!

Descargo de responsabilidad: No estoy muy seguro de lo que sucederá si utiliza algún tipo de cosa multiparte SOAP.

+0

Encontré tu publicación muy útil. Estoy luchando para obtener respuesta XML. Puedo obtener la solicitud pero la respuesta SOAP no está obteniendo, de hecho el método de invocación está invocando solo en la fase de solicitud. He hecho toda la configuración sugerida.Además, cuando agrego entradas en la configuración global para solicitar y responder, solo recibo tanto la solicitud como la respuesta, pero dentro de la etiqueta de transporte, recibo solo la solicitud y no recibo respuesta. – Jayesh

+0

Estoy usando TestNG y Selenio. ¿Dónde debería agregar el controlador? En pom.xml o TestNG.xml? – R11G

+0

Encontré esta respuesta muy útil, pero con esto no puedo registrar el error de excepción (excepción). Sugerimos una forma de hacer lo mismo. Tengo la etiqueta faultFlow pero no funciona –

14

Guarde este archivo como "client-config.wsdd" en el directorio de trabajo como lo hace para log4j.properties.

Si no desea modificar ningún código y depurar el cliente del servicio web del eje, puede seguir este método para registrar todos los mensajes emergentes entrantes y salientes.

<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

Se encontró este problema al solucionar un ColdFusion 11 instalación que llamaba .NET WebServices, y seguía obteniendo "java.net.ConnectException: Connection refused". Esto me ayudó a rastrearlo a un espacio de nombres predeterminado incorrecto en el sobre SOAP. (usa "mx.webservices"). – TomEberhard

1

Axis está comprobando por defecto el archivo client-config.wsdd. Necesitamos mantener este archivo en la misma ubicación que log4j.xml o log4j.properties. El archivo de registro se generará en la ubicación especificada en Log Handeller. Asegúrese de que la estructura de carpetas exista.

mukesh

+0

No sabía acerca de ese comportamiento predeterminado. Gracias por la info! – raspayu

8

es necesario agregar un registrador del Eje en el archivo de configuración log4.xml, como a continuación:

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

someLogAppender puede haber un appender Log4J existente, o puede que desee para definir uno dedicado, como abajo:

<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

Spring boot: simplemente agrega 'logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG' en el archivo application.properties – CelinHC

4

Sé que es un hilo antiguo, pero puede ser útil para las personas que buscan respuestas.

Para el registro del lado del servidor AXIS-1, actualice su server-config.wsdd como a continuación. server-config.wsdd está bajo la carpeta WEB-INF de su archivo war.

Un nuevo controlador para el registro. El nombre del archivo junto con la ruta es configurable.

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

También puede utilizar el parámetro con el valor LogHandler.writeToConsole como "true" para iniciar la sesión en su registro de la consola.

A continuación, actualice la sección <globalConfiguration> tener

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

Si el requestFlowresponseFlow y contiene otros controladores, ponga el registro como el primer controlador.

Esto solo debe utilizarse para fines de depuración, no para producción. Dado que el registro es ingenuo y realiza la operación de escritura normal en el archivo sin ningún buffer. En segundo lugar, el archivo de registro crecerá a GB, ya que no hay mecanismo de sustitución.

Para el registro del lado del cliente AXIS-1, actualice su client-config.wsdd como a continuación. El client-config.wsdd debe ir a su classpath directamente debajo de una carpeta raíz configurada en el classpath no en ninguna subcarpeta. La mejor ubicación es el mismo directorio donde está presente su archivo log4j.xml o log4j.properties (Gracias a la publicación #MukeshKoshyM anterior).

<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> 

El mismo problema mencionado para el registro del lado del servidor también es aplicable para el lado del cliente.

Para la producción, escriba su propio controlador de registro extendiendo org.apache.axis.handlers.BasicHandler y configure el archivo de clase en el controlador. Por favor, mire la respuesta anterior de #raspayu para configurar la suya propia. Para registrar las fallas anule el método public void onFault(MessageContext msgContext) en su Manejador.

2

Una solución para registrar los fallos eje es extender el método 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()); 
    } 
    } 
} 

También es obligatorio para configurar el controlador en el flujo de solicitudes de configuración global, en el archivo wsdd será algo como esto:

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

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