我查看了所有邮件,但没有找到该问题的明确答案。
如何配置日志记录以记录CXF入站和出站的restful消息?
我有以下设置。
使用
文件org.apache.cxf.Loggerorg.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>
答案 0 :(得分:9)
假设您使用的是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)为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>
步骤4)在您log4j.xml
中将org.apache.cxf.services
的日志级别设置为INFO,将additivity
设置为FALSE
并附加专用的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>
我创建了blog post which explains how to configure CXF for log4j in more detail。