You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

最后验证步骤

  1. 确保cxf.xml被Spring正确加载(如果是Spring项目),或者代码方式的拦截器已经添加成功
  2. 运行你的tester.java,查看控制台输出
  3. 如果还是没看到日志,检查:
    • Log4j配置文件是否被正确读取(可以加一个测试日志输出验证)
    • CXF的日志级别是不是被其他配置覆盖了
    • 拦截器是不是被正确添加到客户端实例上

内容的提问来源于stack exchange,提问作者Gayathri Sivakumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:27