How to log Apache CXF Soap Request and Soap Response using Log4j?

前端 未结 10 1021
谎友^
谎友^ 2020-11-29 19:07

I am using the Apache CXF Framework. Inside my client program, I need to log CXF SOAP Requests and SOAP Responses. When I used



        
相关标签:
10条回答
  • 2020-11-29 20:07

    Procedure for global setting of client/server logging of SOAP/REST requests/ responses with log4j logger. This way you set up logging for the whole application without having to change the code, war, jar files, etc.

    1. install file cxf-rt-features-logging-X.Y.Z.jar to your CLASS_PATH

    2. create file (path for example: /opt/cxf/cxf-logging.xml):

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation="http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
      <cxf:bus>
       <cxf:features>
       <bean class="org.apache.cxf.ext.logging.LoggingFeature">
       <property name="prettyLogging" value="true"/>
       </bean>
       </cxf:features>
       </cxf:bus>
       </beans>
      
    3. set logging for org.apache.cxf (log4j 1.x) log4j.logger.org.apache.cxf=INFO,YOUR_APPENDER

    4. set these properties on java start-up

    java ... -Dcxf.config.file.url=file:///opt/cxf/cxf-logging.xml -Dorg.apache.cxf.Logger=org.apache.cxf.common.logging.Log4jLogger -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true -Dcom.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true ...

    I don't know why, but it is necessary to set variables as well com.sun.xml.*

    0 讨论(0)
  • Simplest way to achieve pretty logging in 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);
    
    0 讨论(0)
  • 2020-11-29 20:12

    When configuring log4j.properties, putting org.apache.cxf logging level to INFO is enough to see the plain SOAP messages:

    log4j.logger.org.apache.cxf=INFO
    

    DEBUG is too verbose.

    0 讨论(0)
  • Try this code:

    EndpointImpl impl = (EndpointImpl)Endpoint.publish(address, implementor);
        impl.getServer().getEndpoint().getInInterceptors().add(new LoggingInInterceptor());
        impl.getServer().getEndpoint().getOutInterceptors().add(new LoggingOutInterceptor());
    

    Inside the logback.xml you need to put the interface name for 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>
    
    0 讨论(0)
提交回复
热议问题