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?

35
demandé sur Radek Postołowicz 2011-11-09 17:31:29

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.

62
répondu Tomasz Nurkiewicz 2017-01-23 13:40:30

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

12
répondu Vins 2017-01-23 14:04:26

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);
9
répondu dpa 2017-01-23 14:45:58

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>
2
répondu Manjunath 2015-06-25 12:13:55

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.

1
répondu dpinya 2013-07-23 11:37:32

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>
1
répondu Ahmad Alhaj Hussein 2017-01-23 14:15:20

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

1
répondu Jose 2017-01-23 16:37:25

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

0
répondu Sebastián Vásquez 2017-04-13 22:09:14

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);
0
répondu Al Grant 2018-02-08 01:28:32