基于IntelliJ Maven项目:Apache CXF SOAP请求响应日志配置求助
解决CXF SOAP请求/响应日志记录问题
嗨,我来帮你搞定这个SOAP日志的配置问题!这在CXF开发里是很常见的需求,咱们一步步来排查和配置:
一、通过cxf.xml配置日志拦截器(推荐,适合Spring集成场景)
既然你已经有cxf.xml,直接在这个文件里添加CXF自带的日志拦截器就可以了,这是最省心的方式。把下面的配置加到你的cxf.xml中:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> <!-- 定义日志拦截器Bean --> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/> <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> <!-- 给你的WebService客户端代理添加拦截器 --> <bean id="yourWebServiceClient" class="com.yourpackage.YourGeneratedClientProxy"> <property name="serviceClass" value="com.yourpackage.YourWebServicePortType"/> <property name="address" value="${webservice.url}"/> <!-- 这里可以引用config.properties里的地址配置 --> <!-- 入站拦截器(接收响应时记录) --> <property name="inInterceptors"> <list> <ref bean="loggingInInterceptor"/> </list> </property> <!-- 出站拦截器(发送请求时记录) --> <property name="outInterceptors"> <list> <ref bean="loggingOutInterceptor"/> </list> </property> </bean> </beans>
注意替换com.yourpackage.YourGeneratedClientProxy和YourWebServicePortType为你实际生成的客户端类和端口类型。
二、如果是代码方式创建客户端,手动添加拦截器
要是你的client.java是直接通过代码实例化客户端,而不是用Spring配置的,那就在代码里手动添加日志拦截器:
import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.yourpackage.YourWebServicePortType; import com.yourpackage.YourWebServiceService; public class Client { public static void main(String[] args) { // 实例化生成的服务和端口 YourWebServiceService service = new YourWebServiceService(); YourWebServicePortType port = service.getYourWebServicePort(); // 获取CXF底层客户端,添加日志拦截器 org.apache.cxf.endpoint.Client cxfClient = org.apache.cxf.frontend.ClientProxy.getClient(port); cxfClient.getInInterceptors().add(new LoggingInInterceptor()); cxfClient.getOutInterceptors().add(new LoggingOutInterceptor()); // 调用你的WebService方法 port.yourServiceMethod(); } }
三、确保Log4j配置正确(关键!)
你已经把log4j.xml放到META-INF了,但要确保CXF的日志级别足够低,才能看到SOAP的详细内容。修改你的log4j.xml,添加以下配置:
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 控制台输出器,可根据需求调整格式 --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/> </layout> </appender> <!-- 配置CXF相关日志,DEBUG级别可以看到完整的SOAP消息 --> <logger name="org.apache.cxf"> <level value="DEBUG"/> <appender-ref ref="console"/> </logger> <!-- 也可以单独针对日志拦截器设置级别,INFO就足够看到SOAP内容 --> <logger name="org.apache.cxf.interceptor.LoggingOutInterceptor"> <level value="INFO"/> <appender-ref ref="console"/> </logger> <logger name="org.apache.cxf.interceptor.LoggingInInterceptor"> <level value="INFO"/> <appender-ref ref="console"/> </logger> <root> <priority value="INFO"/> <appender-ref ref="console"/> </root> </log4j:configuration>
四、检查Maven依赖是否完整
确保你的pom.xml里包含了CXF和Log4j的必要依赖,版本要和你使用的CXF版本匹配:
<dependencies> <!-- CXF核心WebService依赖 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.5.5</version> <!-- 替换成你项目中的CXF版本 --> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.5.5</version> </dependency> <!-- Log4j依赖 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <!-- 对应你的Log4j版本 --> </dependency> </dependencies>
最后验证步骤
- 确保
cxf.xml被Spring正确加载(如果是Spring项目),或者代码方式的拦截器已经添加成功 - 运行你的
tester.java,查看控制台输出 - 如果还是没看到日志,检查:
- Log4j配置文件是否被正确读取(可以加一个测试日志输出验证)
- CXF的日志级别是不是被其他配置覆盖了
- 拦截器是不是被正确添加到客户端实例上
内容的提问来源于stack exchange,提问作者Gayathri Sivakumar
相关产品推荐
相关产品推荐

