loggingininterceptor logger dorg log4j cxf

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



dorg apache cxf logger (9)

Estoy usando el Marco Apache CXF. Dentro de mi programa 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: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><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?


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

<bean id="loggingFeature" class="org.apache.cxf.feature.LoggingFeature"> <property name="prettyLogging" value="true" /> </bean> <cxf:bus> <cxf:features> <ref bean="loggingFeature" /> </cxf:features> </cxf:bus>

DEBUG es demasiado detallado.


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:

<logger name="org.apache.cxf" level="DEBUG"/>

Para mí, hizo el truco;)


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

log4j.logger.org.apache.cxf=INFO


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


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


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:

<cxf:bus> <cxf:features> <cxf:logging/> </cxf:features> </cxf:bus>

con mucho más detallado:

<bean id="abstractLoggingInterceptor" abstract="true"> <property name="prettyLogging" value="true"/> </bean> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" parent="abstractLoggingInterceptor"/> <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" parent="abstractLoggingInterceptor"/> <cxf:bus> <cxf:inInterceptors> <ref bean="loggingInInterceptor"/> </cxf:inInterceptors> <cxf:outInterceptors> <ref bean="loggingOutInterceptor"/> </cxf:outInterceptors> <cxf:outFaultInterceptors> <ref bean="loggingOutInterceptor"/> </cxf:outFaultInterceptors> <cxf:inFaultInterceptors> <ref bean="loggingInInterceptor"/> </cxf:inFaultInterceptors> </cxf:bus>

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


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


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:

<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender"> <discriminator class="com.progressoft.ecc.integration.logging.ThreadNameDiscriminator"> <key>threadName</key> <defaultValue>unknown</defaultValue> </discriminator> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>logger.contains("InterfaceWebServiceSoap")</expression> </evaluator> <OnMismatch>DENY</OnMismatch> <OnMatch>NEUTRAL</OnMatch> </filter> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>TRACE</level> </filter> <sift> <appender name="FILE-${threadName}" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOGGING_PATH}/${threadName}.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${ARCHIVING_PATH}/%d{yyyy-MM-dd}.${threadName}%i.log.zip </FileNamePattern> <MaxHistory>30</MaxHistory> <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>50MB</MaxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%date{dd-MM-yyyy HH:mm:ss.SSS} | %5level | %-60([%logger{53}:%line]): %msg %ex{full} %n</Pattern> </encoder> </appender> </sift> </appender> <root> <level value="ALL" /> <appender-ref ref="FILE" /> </root>


cxf.xml

<cxf:bus> <cxf:ininterceptors> <ref bean="loggingInInterceptor" /> </cxf:ininterceptors> <cxf:outinterceptors> <ref bean="logOutInterceptor" /> </cxf:outinterceptors> </cxf:bus>

org.apache.cxf.Logger

org.apache.cxf.common.logging.Log4jLogger

Por favor, marque la captura de pantalla here