cxf入站和出站消息记录到单独的日志文件

vlr*_*vlr 5 logging log4j cxf slf4j

我查阅了所有消息,但没有找到该问题的明确答案.

如何配置日志记录以记录CXF入站和出站的restful消息?

我有以下设置.

  • 文件org.apache.cxf.Logger with

    org.apache.cxf.common.logging.Log4jLogger
    
    Run Code Online (Sandbox Code Playgroud)
  • 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>
    
    Run Code Online (Sandbox Code Playgroud)

我试着用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>
Run Code Online (Sandbox Code Playgroud)

Cod*_*und 10

假设您使用的是CXF 2.2.8或更高版本,则需要执行以下操作:

步骤1)META-INF/cxf/org.apache.cxf.Logger在类路径上创建一个包含以下内容的文件:

org.apache.cxf.common.logging.Slf4jLogger
Run Code Online (Sandbox Code Playgroud)

如果你正在使用Maven,这个新文件必须在src/main/resources/META-INF/cxf,而不是在下面src/main/webapp!

步骤2)如果要记录所有消息,请创建CXF LoggingFeature,将prettyLogging属性设置为true并将其添加到CXF总线.

步骤3)为log4j和slf4j-log4j12添加所需的jar文件.如果您使用的是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>
Run Code Online (Sandbox Code Playgroud)

步骤4)在您log4j.xml将日志级别设置org.apache.cxf.services为INFO时,设置additivityFALSE并附加专用的appender:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

我创建了一篇博文,详细介绍了如何为log4j配置CXF.

  • 这里的一切都很好,只需要注意一点:记住将"META-INF/cxf/org.apache.cxf.Logger"放在例如src/main/resources而不是"src/main/webapp"下.这样它将在classpath下. (3认同)