Rajeev
Rajeev

Reputation: 559

logging full request and response using Apache cxf interceptor and log4j in spring

I am trying to log request and response of a soap web service using Apache cxf, Log4j in spring

following is the my project structure

enter image description here

my cxf.xml is

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:cxf="http://cxf.apache.org/core" 
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
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.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

   <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="loggingInInterceptor" />
   <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOutInterceptor" />

    <cxf:bus>
        <cxf:ininterceptors>
            <ref bean="loggingInInterceptor" />
        </cxf:ininterceptors>
        <cxf:outinterceptors>
            <ref bean="logOutInterceptor" />
        </cxf:outinterceptors>
    </cxf:bus>



</beans>

my bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:cxf="http://cxf.apache.org/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    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.xsd
                         http://cxf.apache.org/jaxws  
                         http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <jaxws:endpoint id="bookShelfService"
        implementor="com.test.services.BookShelfServiceImpl" address="/bookshelfservice" />

</beans>

log4j.properties

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\wsimport\\log.txt
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

my org.apache.cxf.Logger

org.apache.cxf.common.logging.Log4jLogger

and web.xml

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/beans.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

I have done above all things but still I am not getting log of request and response of my service with headers

I am using tomcat for deploying my application and using soapui for executing the service.

what thing I am doing wrong here?

please suggest.

But when I am executing below code I am getting expected result in eclipse console

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(BookShelfService.class); //the service SEI
        factory.setAddress("http://localhost:8080/springapp/bookshelfservice");

        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());

        BookShelfService client = (BookShelfService) factory.create();

        BookVO reply = client.getBook("b1");
        System.out.println("Server said: " + reply.getAuthor());

Upvotes: 2

Views: 9681

Answers (1)

Vijendra Kumar Kulhade
Vijendra Kumar Kulhade

Reputation: 2255

I am pretty sure that you don't need to create your own cxf.xml it is already provided by cxf-core jar. so I don't think you should overwrite it. because It will create a new Spring Bus which may not be configured properly with the cxf way. Remove that cxf.xml to avoid conflixt and just import the cxf.xml in you bean.xml and put your cxf.xml code in your bean.xml. Try with this updated bean.xml.

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:cxf="http://cxf.apache.org/core" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:jaxws="http://cxf.apache.org/jaxws" 
       xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
       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.xsd
                           http://cxf.apache.org/jaxws  
                           http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="loggingInInterceptor" />
    <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOutInterceptor" />

    <cxf:bus>
        <cxf:ininterceptors>
            <ref bean="loggingInInterceptor" />
        </cxf:ininterceptors>
        <cxf:outinterceptors>
            <ref bean="logOutInterceptor" />
        </cxf:outinterceptors>
    </cxf:bus>


    <jaxws:endpoint id="bookShelfService" implementor="com.test.services.BookShelfServiceImpl" address="/bookshelfservice" />

</beans>

Upvotes: 3

Related Questions