Comment connecter la requête Soap Apache CXF et la réponse Soap en utilisant Log4j
J'utilise le Framework Apache CXF. Dans mon programme client, je dois enregistrer les requêtes et les réponses de SOAP CXF. Lorsque j'ai utilisé
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress(host);
factory.setServiceClass(MyService.class);
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
j'ai eu ces SAVON Demande et Réponses SOAP dans la console:
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
--------------------------------------
mais mon exigence actuelle est, au lieu de les imprimer sur la console du serveur, je dois les avoir dans le fichier journal.
quand j'ai utilisé log4j directement comme indiqué
log4j(factory.getInInterceptors().add(new LoggingInInterceptor()));
log4j(factory.getOutInterceptors().add(new LoggingOutInterceptor()));
C'est seulement l'impression true
et true
à l'intérieur du fichier journal.
quelqu'un pourrait-il me dire comment configurer ceci?
9 réponses
Vous devez créer un fichier nommé org.apache.cxf.Logger
(c'est-à-dire: org.apache.cxf
le fichier Logger
extension) sous /META-INF/cxf/
avec le contenu suivant:
org.apache.cxf.common.logging.Log4jLogger
Référence: utilisant Log4j au lieu de java.util.la journalisation et configurer la journalisation CXF pour passer par Log4J.
Aussi, si vous remplacer la norme:
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
avec beaucoup plus de commentaires:
<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 va imprimer des messages XML en les formatant avec bonne indentation et bris de ligne. Très utile. Plus à ce sujet ici.
un autre moyen facile est de configurer l'enregistreur comme ceci - assurez-vous que vous le faites avant de charger les classes de service Web de cxf. Vous pouvez l'utiliser dans certains blocs statiques.
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());
}
alors les messages entrants et sortants seront imprimés dans le fichier Log4j au lieu de la console. Assurez-vous que votre log4j est configuré correctement
la façon la plus simple de réaliser une belle journalisation dans 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);
dans votre contexte de printemps, la configuration ci-dessous logerait la requête et la réponse soap message.
<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>
Lors de la configuration de log4j.properties
, en mettant org.apache.cxf
niveau de journalisation INFO
est suffisant pour voir les messages simples de savon:
log4j.logger.org.apache.cxf=INFO
DEBUG est trop verbeux.
Essayez ce code:
EndpointImpl impl = (EndpointImpl)Endpoint.publish(address, implementor);
impl.getServer().getEndpoint().getInInterceptors().add(new LoggingInInterceptor());
impl.getServer().getEndpoint().getOutInterceptors().add(new LoggingOutInterceptor());
à l'intérieur du logback.xml
vous devez mettre le nom de l'interface pour webservice:
<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.Enregistreur
org.apache.cxf.common.logging.Log4jLogger
Veuillez vérifier capture d'écran ici
Dans le cas où quelqu'un veut le faire, à l'aide de Play Framework (et à l'aide de LogBack http://logback.qos.ch/), vous pouvez configurer l'application enregistreur.xml avec cette ligne:
<logger name="org.apache.cxf" level="DEBUG"/>
Pour moi, ça a fait l'affaire ;)
Cela a fonctionné pour moi.
configurer log4j comme normal. Alors utilisez ce code:
// 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);