J'utilise Apache CXF Framework . Dans mon programme client, je dois enregistrer les demandes CXF SOAP et les réponses SOAP ..__
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress(Host);
factory.setServiceClass(MyService.class);
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
J'ai reçu ces demandes SOAP et 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 réelle est qu'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()));
Il n’imprime que true
et true
dans le fichier journal.
Quelqu'un pourrait-il s'il vous plaît laissez-moi savoir comment configurer cela?
Vous devez créer un fichier nommé org.Apache.cxf.Logger
(c'est-à-dire: org.Apache.cxf
fichier avec l'extension Logger
) sous /META-INF/cxf/
avec le contenu suivant:
org.Apache.cxf.common.logging.Log4jLogger
Référence: Utilisation de Log4j au lieu de Java.util.logging .
Aussi, si vous remplacez standard:
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
avec beaucoup plus verbeux:
<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 imprimera plutôt des messages XML en les formatant avec une indentation et des sauts de ligne appropriés. Très utile. Plus à ce sujet ici .
Un autre moyen simple consiste à configurer le consignateur comme suit: assurez-vous de le faire avant de charger les classes liées au service Web 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());
}
Ensuite, 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
Le moyen le plus simple de réaliser de jolies journalisations 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 consignera la requête et le message de réponse.
<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>
Cela a fonctionné pour moi.
Installez log4j comme d'habitude. 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);
Essayez ce code:
EndpointImpl impl = (EndpointImpl)Endpoint.publish(address, implementor);
impl.getServer().getEndpoint().getInInterceptors().add(new LoggingInInterceptor());
impl.getServer().getEndpoint().getOutInterceptors().add(new LoggingOutInterceptor());
Dans le logback.xml
, vous devez indiquer le nom d'interface pour le service 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
S'il vous plaît vérifier capture d'écran ici
Lors de la configuration de log4j.properties
, il suffit de placer le niveau de journalisation org.Apache.cxf
sur INFO
pour afficher les messages simples SOAP:
log4j.logger.org.Apache.cxf=INFO
DEBUG est trop verbeux.
Au cas où quelqu'un voudrait faire cela en utilisant Play Framework (et en utilisant LogBack http://logback.qos.ch/ ), vous pouvez configurer le fichier application-logger.xml avec cette ligne:
<logger name="org.Apache.cxf" level="DEBUG"/>
Pour moi, ça a fait l'affaire;)