регистрация входящих и исходящих сообщений cxf в отдельный файл журнала - PullRequest
5 голосов
/ 24 февраля 2012

Я просмотрел все сообщения, но не нашел четкого ответа на этот вопрос.

Как я могу настроить ведение журнала для входа входящих и исходящих CXF-сообщений restful?

У меня есть следующие настройки.

  • Файл org.apache.cxf.Logger с

    org.apache.cxf.common.logging.Log4jLogger
    
  • applicationContext.xml имеет следующее (звучит глупо, но это единственное место для перехватчиков, где я могу получать сообщения)

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

Я пытался следовать этим инструкциям с slf4j и с log4j, но единственный выход, который я получаю в файл - это сообщения журнала приложения. Я вижу входящие и исходящие сообщения на своей консоли.

Могу ли я получить что-то похожее на logback.xml для меня, поэтому я разделяю журналы приложений и журналы сообщений. Пример: http://www.wolfe.id.au/2011/05/20/apache-cxf-logging/

Спасибо.

РЕДАКТИРОВАТЬ 1: Я удалил org.apache.cxf.common.logging.Log4jLogger из моего пути к классам и поместил следующее в свой log4j.xml. Это запись в файл и на консоль, когда уровень ведения журнала равен INFO.

<appender name="RSLOGFILE" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="${project.basedir}/logs/cxf_inout_messages.log"/>
<param name="MaxFileSize" value="100KB"/>
<!-- Keep one backup file -->
<param name="MaxBackupIndex" value="1"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
</layout>
</appender>
<logger name="org.apache.cxf">
<level value="ERROR"/>
<appender-ref ref="RSLOGFILE"/>
</logger>

1 Ответ

9 голосов
/ 12 января 2015

Если вы используете CXF 2.2.8 или выше, вам нужно будет сделать следующее:

шаг 1) Создайте файл META-INF/cxf/org.apache.cxf.Logger на пути к классам, содержащий следующее:

org.apache.cxf.common.logging.Slf4jLogger

Если вы используете Maven, этот новый файл должен быть в src/main/resources/META-INF/cxf, а не ниже src/main/webapp!

шаг 2) Если вы хотите регистрировать все сообщения, создайте CXF LoggingFeature, задайте для свойства prettyLogging значение true и добавьте его в шину CXF.

шаг 3) Добавьте необходимые файлы jar для log4j и slf4j-log4j12. Если вы используете Maven, включите следующие зависимости:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>

шаг 4) В вас log4j.xml установите для уровня журнала org.apache.cxf.services значение INFO, установите для additivity значение FALSE и присоедините выделенный объект:

<!-- level INFO needed to log SOAP messages -->
<logger name="org.apache.cxf.services" additivity="false">
    <level value="INFO" />
    <!-- specify a dedicated appender for the SOAP messages -->
    <appender-ref ref="WS_LOG_FILE" /> 
</logger>

Я создал пост в блоге , в котором более подробно объясняется, как настроить CXF для log4j .

...