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

Java中如何记录SOAP错误请求?现有Log4j配置仅适配正常请求

排查SOAP错误请求无日志输出的问题

嘿,我来帮你解决这个SOAP错误请求不记录日志的麻烦!你当前配置的log4j.logger.org.springframework.ws.server.MessageTracing=TRACE只能捕获Spring WS正常处理流程中的请求和响应,但错误请求可能根本没走到这个环节,或者被异常处理逻辑吞掉了。下面是几个实用的排查步骤:

  • 先确认请求是否到达Spring WS处理链
    很多时候格式错误的SOAP请求会被Servlet容器(比如Tomcat)或者前置的Spring过滤器拦截,根本没到Spring WS的MessageTracing组件。这时候可以:

    • 把Servlet容器的日志级别调到DEBUG:log4j.logger.org.apache.catalina.core=DEBUG(Tomcat为例),看看请求有没有被正常接收并转发到你的SOAP端点。
    • 开启Spring DispatcherServlet的DEBUG日志:log4j.logger.org.springframework.web.servlet.DispatcherServlet=DEBUG,确认请求是否被路由到Spring WS的处理流程中。
  • 检查Spring WS的异常处理日志
    如果请求到达了端点但处理出错,可能你的异常处理器没有记录请求内容:

    • 开启端点处理的DEBUG日志:log4j.logger.org.springframework.ws.server.endpoint=DEBUG,这样端点抛出的异常和请求细节会被自动记录。
    • 如果你自定义了EndpointExceptionResolver,记得在处理异常时手动打印原始请求内容——可以通过WebServiceMessage或者HttpServletRequest的输入流来获取请求体,避免只处理异常返回而漏掉请求日志。
  • 手动添加请求拦截Filter(最稳妥的方法)
    要是上面的方法都没效果,直接在请求入口处加一个Filter来强制记录所有请求,不管是否有效:
    写一个简单的OncePerRequestFilter实现,用ContentCachingRequestWrapper缓存请求输入流(避免后续处理读不到),然后打印请求内容:

    @Component
    public class SoapRequestLoggingFilter extends OncePerRequestFilter {
        private static final Logger logger = LoggerFactory.getLogger(SoapRequestLoggingFilter.class);
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
            // 先让请求走后续处理链
            filterChain.doFilter(wrappedRequest, response);
            // 打印缓存的请求体
            String requestBody = new String(wrappedRequest.getContentAsByteArray(), wrappedRequest.getCharacterEncoding());
            logger.info("Raw SOAP request: {}", requestBody);
        }
    }
    

    这个Filter会捕获所有到达应用的HTTP请求,不管格式是否正确,能帮你直接看到原始请求内容。

  • 验证log4j配置是否生效
    最后再确认下你的log4j配置有没有被覆盖:

    • 检查org.springframework.ws.server.MessageTracing的TRACE级别是否正确关联到了Appender(比如Console或File),没有被其他更高优先级的logger配置覆盖。
    • 可以临时把log4j.logger.org.springframework.ws=TRACE加上,扩大Spring WS整个模块的日志范围,看看能不能捕获到更多细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:20:11