2011-01-04 2 views

ответ

17

Добавьте следующее конечных точек и клиентов:

<jaxws:features> 
    <bean class="org.apache.cxf.feature.LoggingFeature" /> 
</jaxws:features> 

Это будет регистрировать все в журнал сервера.

Если вы хотите зарегистрировать их в другом месте, ознакомьтесь с исходным кодом встроенного CXF LoggingInInterceptor и LoggingOutInterceptor. Вы можете следовать шаблону, который они используют, чтобы захватить сообщения в пути/выходе и делать с ними то, что вам нравится.

Добавить свои собственные перехватчики в цепи с чем-то вроде этого:

<jaxws:inInterceptors> 
    <ref bean="myLoggingInInterceptor" /> 
</jaxws:inInterceptors> 
+0

Будет ли это не просто выгружать контент, неформатированный, то есть не как XML? – irishguy

+0

Он покажет XML в журнале сервера. – BPS

+1

Более подробную функцию ведения журнала можно найти в https://github.com/greenbird/xml-formatter-components/tree/master/cxf – ThomasRS

26

Итак, я попытался немного больше с этим. Для получения запроса XML и ответы протоколируются, и если вы используете Log4J, вам необходимо установить логарифмически уровень CXF в log4j.xml файл, как это (> = INFO):

<logger name="org.apache.cxf" > 
    <level value="INFO" /> 
</logger> 

И cxf.xml файл должен содержать следующее:

<cxf:bus> 
    <cxf:features> 
     <cxf:logging/> 
    </cxf:features> 
</cxf:bus> 

Оба файла должен быть в CLASSPATH.

Чтобы отобразить сообщение мыло добавить это в ваш код:

Client client = ClientProxy.getClient(service); 
client.getInInterceptors().add(new LoggingInInterceptor()); 
client.getOutInterceptors().add(new LoggingOutInterceptor()); 
+0

Существует несколько основных способов ведения журнала CXF. Это способ конфигурации log4j ... тот, что указан выше, является файлом конфигурации файла jaxws –

18

Запрос мыло XML может быть легко регистрируется с помощью обычая В перехватчика. Скажем, у нас есть перехватчик под названием «wsLoggingInInterceptor», поэтому в файле контекста будет иметь следующий вид:

<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/> 
<bean id="logOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> 
<bean id="wsLoggingInInterceptor" class="org.jinouts.webservice.logging.WSLoggingInInterceptor"/> 


    <cxf:bus> 
     <cxf:inInterceptors> 
      <ref bean="loggingInInterceptor"/> 
      <ref bean="wsLoggingInInterceptor"/> 
     </cxf:inInterceptors> 
     <cxf:outInterceptors> 
      <ref bean="logOutInterceptor"/>    
     </cxf:outInterceptors> 
    </cxf:bus> 

В классе мы можем получить запрос XML следующим образом:

public class WSLoggingInInterceptor extends AbstractSoapInterceptor 
{ 

    public WSLoggingInInterceptor() 
    { 
     super(Phase.RECEIVE); 
    } 

    @Override 
    public void handleMessage (SoapMessage message) throws Fault 
    { 
     //get the remote address 
     HttpServletRequest httpRequest = (HttpServletRequest) message.get (AbstractHTTPDestination.HTTP_REQUEST); 
     System.out.println ("Request From the address : " + httpRequest.getRemoteAddr ()); 

     try 
     { 
      // now get the request xml 
      InputStream is = message.getContent (InputStream.class); 
      CachedOutputStream os = new CachedOutputStream (); 
      IOUtils.copy (is, os); 
      os.flush (); 
      message.setContent ( InputStream.class, os.getInputStream ()); 
      is.close (); 

      System.out.println ("The request is: " + IOUtils.toString (os.getInputStream ())); 
      os.close (); 
     } 

     catch (Exception ex) 
     { 
      ex.printStackTrace (); 
     } 

    } 

} 

Look , здесь я также регистрирую адрес, откуда идет запрос. Вы также можете получить дополнительную информацию из объекта «HttpServletRequest». вы можете иметь больше от: http://cxf.apache.org/docs/interceptors.html

Для входа ответа XML вы можете посмотреть на this thread

2

Это гораздо проще, чтобы добавить свой собственный журнал для свойств конечной точки. В этом случае перехватчик регистрации по умолчанию будет искать ваш логгер в свойствах конечных точек, и если он найдет его, он будет использовать его, иначе он будет создавать по умолчанию.Вот мой пример использования:

<jaxws:endpoint 
     xmlns:client="http://service.info.client.diasoft.services.stream.integration.cib.sberbank.ru" 
     address="/diasoft/clientInfoWS" 
     serviceName="client:ClientWS" 
     implementor="#clientServiceImpl"> 
    <jaxws:properties> 
     <entry key="MessageLogger" value-ref="logger"/> 
    </jaxws:properties> 
    <jaxws:features> 
     <bean class="org.apache.cxf.feature.LoggingFeature"/> 
    </jaxws:features> 
</jaxws:endpoint> 


<bean id="logger" class="org.apache.cxf.common.logging.LogUtils" factory-method="getLogger"> 
    <constructor-arg value="ru.sberbank.cib.integration.stream.services.diasoft.client.info.service.ClientWSImpl"/> 
</bean> 
2

Если вы используете Spring с подмигнули Java-конфигурации, есть 2 простых способов активации Ведение журнала SOAP-сообщения с Apache CXF:

  1. Непосредственно на SpringBus - это полезно, если вы хотите, чтобы регистрировать сообщения о всех ваших CxF-Endpoints:

    @Bean(name=Bus.DEFAULT_BUS_ID) public SpringBus springBus() { SpringBus springBus = new SpringBus(); LoggingFeature logFeature = new LoggingFeature(); logFeature.setPrettyLogging(true); logFeature.initialize(springBus); springBus.getFeatures().add(logFeature); return springBus; }

  2. Включение журналирования отдельно в преддверии Ry воздействию CXF конечных точек

    @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), weatherService()); endpoint.publish(SERVICE_NAME_URL_PATH); endpoint.setWsdlLocation("Weather1.0.wsdl"); LoggingFeature logFeature = new LoggingFeature(); logFeature.setPrettyLogging(true); logFeature.initialize(springBus()); endpoint.getFeatures().add(logFeature); return endpoint; }

напомнить LoggingFeature.setPrettyLogging (истина); Метод просмотра довольно печатных SOAP-сообщений и LoggingFeature.initialize (springBus()); - без последней магии не бывает. Для более чистого кода вы также можете отделить LoggingFeature как отдельный Bean и ввести его либо в свой SpringBus, либо в Endpoint-Bean.