web-dev-qa-db-fra.com

Comment enregistrer Apache CXF Soap Request et Soap Response à l'aide de Log4j?

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?

36
Pawan

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 .

65

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

13
Vins

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

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

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);
2
Al Grant

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

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

1
Jose

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.

1
dpinya

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

0