Cómo registrar Apache CXF Soap Request y Soap Response usando Log4j

Estoy usando el Marco Apache CXF. Dentro de mi progtwig de cliente, necesito registrar Solicitudes SOAP CXF y Respuestas SOAP. Cuando utilicé

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress(host); factory.setServiceClass(MyService.class); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); 

Recibí estas solicitudes SOAP y respuestas SOAP en la consola:

 Nov 9, 2011 6:48:01 PM org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose INFO: Outbound Message --------------------------- ID: 2 Encoding: UTF-8 Content-Type: text/xml Headers: {} Payload: <ns4:MYResponse -------------------------------------- 

Pero mi requisito real es que, en lugar de imprimirlos en la consola del servidor, los tenga dentro del archivo de registro.

Cuando utilicé log4j directamente como se muestra

 log4j(factory.getInInterceptors().add(new LoggingInInterceptor())); log4j(factory.getOutInterceptors().add(new LoggingOutInterceptor())); 

Solo se imprime true y true dentro del archivo de registro.

¿Alguien podría decirme cómo configurar esto?

Necesita crear un archivo llamado org.apache.cxf.Logger (es decir: archivo org.apache.cxf con extensión Logger ) en /META-INF/cxf/ con los siguientes contenidos:

 org.apache.cxf.common.logging.Log4jLogger 

Referencia: Usar Log4j en lugar de java.util.logging y Configurar el registro de CXF para ir a Log4J .

Además, si reemplaza el estándar:

      

con mucho más detallado:

                    

Apache CXF imprimirá bastante los mensajes XML formateándolos con sangría y saltos de línea apropiados. Muy útil. Más sobre esto aquí .

Otra manera fácil es configurar el registrador de esta manera: asegúrese de hacerlo antes de cargar las clases relacionadas con el servicio web de cxf. Puedes usarlo en algunos bloques estáticos.

 YourClientConstructor() { LogUtils.setLoggerClass(org.apache.cxf.common.logging.Log4jLogger.class); URL wsdlURL = YOurURL;// //create the service YourService = new YourService(wsdlURL, SERVICE_NAME); port = yourService.getServicePort(); Client client = ClientProxy.getClient(port); client.getInInterceptors().add(new LoggingInInterceptor()); client.getOutInterceptors().add(new LoggingOutInterceptor()); } 

Luego, los mensajes entrantes y salientes se imprimirán en el archivo Log4j en lugar de en la consola. Asegúrese de que su log4j esté configurado correctamente

La forma más simple de lograr un registro bonito en Preethi Jain szenario:

 LoggingInInterceptor loggingInInterceptor = new LoggingInInterceptor(); loggingInInterceptor.setPrettyLogging(true); LoggingOutInterceptor loggingOutInterceptor = new LoggingOutInterceptor(); loggingOutInterceptor.setPrettyLogging(true); factory.getInInterceptors().add(loggingInInterceptor); factory.getOutInterceptors().add(loggingOutInterceptor); 

Al configurar log4j.properties , poner nivel de registro org.apache.cxf en INFO es suficiente para ver los mensajes SOAP normales:

 log4j.logger.org.apache.cxf=INFO 

DEBUG es demasiado detallado.

En su contexto de spring, configurar a continuación se registraría el mensaje de soap de solicitud y respuesta.

         

Prueba este código:

 EndpointImpl impl = (EndpointImpl)Endpoint.publish(address, implementor); impl.getServer().getEndpoint().getInInterceptors().add(new LoggingInInterceptor()); impl.getServer().getEndpoint().getOutInterceptors().add(new LoggingOutInterceptor()); 

Dentro de logback.xml , debe poner el nombre de la interfaz para el servicio web:

   threadName unknown    logger.contains("InterfaceWebServiceSoap")  DENY NEUTRAL   TRACE    ${LOGGING_PATH}/${threadName}.log  ${ARCHIVING_PATH}/%d{yyyy-MM-dd}.${threadName}%i.log.zip  30  50MB    %date{dd-MM-yyyy HH:mm:ss.SSS} | %5level | %-60([%logger{53}:%line]): %msg %ex{full} %n         

cxf.xml

         

org.apache.cxf.Logger

 org.apache.cxf.common.logging.Log4jLogger 

Por favor, marque la captura de pantalla aquí

En caso de que alguien quiera hacer esto, usando Play Framework (y usando LogBack http://logback.qos.ch/ ), entonces puede configurar el archivo application-logger.xml con esta línea:

   

Para mí, hizo el truco;)

Esto funcionó para mí.

Configure log4j como de costumbre. Luego usa este código:

  // LOGGING LoggingOutInterceptor loi = new LoggingOutInterceptor(); loi.setPrettyLogging(true); LoggingInInterceptor lii = new LoggingInInterceptor(); lii.setPrettyLogging(true); org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(isalesService); org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint(); cxfEndpoint.getOutInterceptors().add(loi); cxfEndpoint.getInInterceptors().add(lii);