【问题标题】:How can I log with Log4J SOAP request and response in AXIS 1.x?如何在 AXIS 1.x 中使用 Log4J SOAP 请求和响应进行日志记录?
【发布时间】:2012-09-20 06:10:26
【问题描述】:

我遇到了下一个问题:

我想记录登陆我的 Web 服务(服务器端)的 SOAP 请求/响应。尝试在 wsdd 文件中配置我的 Web 服务。我总是登陆类似下一个的页面:

How to use the org.apache.axis.handlers.LogHandler

建议配置 Apeche Axis LogHandler 来记录请求/响应。这对我无效,因为 a) 无法在此处链接 log4j,并且 b) 我无法使其正常工作。

有人知道如何让我的 log4j 记录请求/响应吗?

【问题讨论】:

    标签: soap log4j axis


    【解决方案1】:

    所以在几个小时后或在网上搜索了一下,我决定冒险并编写我自己的处理程序。比预期的要容易得多。

    我创建了一个扩展抽象类 BasicHandler (org.apache.axis.handlers.BasicHandler) 的类,并实现了记录请求或响应的调用方法。这是我的班级,我将其命名为 SOAPLogHandler :

    package com.mypackage.axishandlers;
    
    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.apache.axis.handlers.BasicHandler;
    import org.apache.log4j.Logger;
    
    public class SOAPLogHandler extends BasicHandler {
    
    private static Logger LOG= Logger.getLogger(SOAPLogHandler.class);
    private static final long serialVersionUID = 1L;
    
    @Override
    public void invoke(MessageContext msgContext) throws AxisFault {
        if(msgContext.getResponseMessage() != null && msgContext.getResponseMessage().getSOAPPart() != null) {
            LOG.info(" Response = " + msgContext.getResponseMessage().getSOAPPartAsString());
        } else {
            if(msgContext.getRequestMessage() != null && msgContext.getRequestMessage().getSOAPPartAsString() != null) {
                LOG.info(" Request = " + msgContext.getRequestMessage().getSOAPPartAsString());
            }    
        }
    }  }
    

    这个想法是,首先记录请求,然后在处理后记录响应。因此,在 server-config.wsdd (或者如果您在客户端,则来自您的客户端的 wsdd 文件)中,我们必须添加一个指向该类的处理程序,并将其配置为使用请求/响应链:

    第一次添加处理程序

     <handler name="log" type="java:com.mypackage.axishandlers.SOAPLogHandler"/>
    

    第二次将该处理程序的使用添加到来自 http 传输的请求/响应(关注日志处理程序)

     <transport name="http">
      <requestFlow>
       <handler type="log"/>
       <handler type="URLMapper"/>
       <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
      </requestFlow>
      <responseFlow>
       <handler type="log"/>
      </responseFlow>
    ...
     </transport>
    

    这样,魔法就完成了,您应该会收到来自请求/响应的漂亮日志!

    免责声明:我不确定如果您使用某种 SOAP 多部分的东西会发生什么。

    【讨论】:

    • 我发现你的帖子很有帮助。我正在努力获取响应 XML。我能够得到请求,但响应 SOAP 没有得到,事实上调用方法只在请求阶段调用。我已经完成了所有建议的配置。此外,当我在全局配置中为请求和响应添加条目时,只有我同时获得请求和响应,但在传输标签内,我只收到请求而没有响应。
    • 我正在使用 TestNG 和 Selenium。我应该在哪里添加处理程序?在 pom.xml 或 TestNG.xml 中?
    • 我发现这个答案非常有用,但是我无法记录soapfault(异常)。请建议一种方法来做同样的事情。我有 faultFlow 标签,但它不工作
    • 我没有发现任何类似于 msgContext.getResponseMessage() 的错误消息(如 msgContext.getFaultMessage),所以我认为处理程序本身没有任何问题。当出现肥皂故障时,我感觉在到达此处理程序之前,有些东西正在捕获您的请求。对不起,我现在无法提供更多帮助,也许您可​​以检查您的 server-config.wsdd
    【解决方案2】:

    在工作目录中将此文件另存为“client-config.wsdd”,就像对 log4j.properties 所做的那样。

    如果您不想更改任何代码并调试您的axis Web 服务客户端,您可以按照此方法记录所有传入和传出的soap 消息。

    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    
    <handler name="log" type="java:org.apache.axis.handlers.LogHandler" >
        <parameter name="LogHandler.fileName" value="c:/logs/axis.log"/>
    </handler>
    
    <globalConfiguration>
        <requestFlow>
            <handler type="log" />
        </requestFlow>
        <responseFlow>
            <handler type="log" />
        </responseFlow>
    </globalConfiguration>
    
    <transport name="http"
        pivot="java:org.apache.axis.transport.http.HTTPSender" />
    
    </deployment>
    

    【讨论】:

    • 在对调用 .NET WebServices 的 ColdFusion 11 安装进行故障排除时遇到此问题,并且不断收到“java.net.ConnectException: Connection denied”。这帮助我将它跟踪到 SOAP 信封中的错误默认命名空间。 (它使用“mx.webservices”)。
    【解决方案3】:

    您需要在 log4.xml 配置文件中添加一个 Axis 记录器,如下所示:

    <logger name="org.apache.axis.transport.http.HTTPSender">
       <level value="DEBUG"/>
       <appender-ref ref="someLogAppender"/>
    </logger>
    

    someLogAppender 可能是现有的 Log4J 附加程序,或者您可能想要定义一个专用的附加程序,如下所示:

    <appender name="someLogAppender" class="org.apache.log4j.FileAppender">
       <param name="File" value="/my/path/to/axis.log" />
       <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
       </layout>
    </appender>
    

    【讨论】:

    • Spring boot:在application.properties文件中添加logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG
    【解决方案4】:

    我知道这是一个旧线程,但可能对寻找答案的人有用。

    对于 AXIS-1 服务器端日志记录,更新您的 server-config.wsdd,如下所示。 server-config.wsdd 位于您的 war 文件的 WEB-INF 文件夹下。

    一个新的日志处理程序。文件名和路径是可配置的。

    <handler name="log" type="java:org.apache.axis.handlers.LogHandler">
      <parameter name="LogHandler.fileName" value="/tmp/req-res-axis.log" />
    </handler>
    

    您也可以使用LogHandler.writeToConsole 参数,其值为"true" 来登录您的控制台日志。

    然后更新&lt;globalConfiguration&gt; 部分以具有

    <requestFlow>
     <handler type="log"/>         
    </requestFlow>
    <responseFlow> 
     <handler type="log"/>
    </responseFlow>
    

    如果requestFlowresponseFlow 包含其他处理程序,则将日志作为第一个处理程序。

    这应该只用于调试目的而不是用于生产。由于日志记录是幼稚的,并且在没有任何缓冲区的情况下对文件执行正常的写入操作。其次,由于没有翻转机制,日志文件将增长到 GB。

    对于 AXIS-1 客户端日志记录,更新您的 client-config.wsdd,如下所示。 client-config.wsdd 应该直接进入您的 classpath 下的 classpath 配置的根文件夹下,而不是在任何子文件夹中。最佳位置是您的 log4j.xmllog4j.properties 文件所在的同一目录(感谢上面的#MukeshKoshyM 帖子)。

        <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    
        <handler name="log" type="java:org.apache.axis.handlers.LogHandler" >
         <parameter name="LogHandler.fileName" value="/tmp/axis_req_res.log"/>
        </handler>
    
        <globalConfiguration>
          <requestFlow>
            <handler type="log" />
         </requestFlow>
         <responseFlow>
            <handler type="log" />
         </responseFlow>
        </globalConfiguration>
    
    <transport name="http"
        pivot="java:org.apache.axis.transport.http.HTTPSender" />
    </deployment>
    

    服务器端日志记录提到的相同问题也适用于客户端。

    对于生产,通过扩展org.apache.axis.handlers.BasicHandler 编写自己的日志处理程序,并在处理程序中配置类文件。请查看#raspayu 的上述答案以配置您自己的答案。要记录错误,请覆盖 Handler 中的 public void onFault(MessageContext msgContext) 方法。

    【讨论】:

      【解决方案5】:

      记录轴故障的解决方案是扩展 OnFault 方法:

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.apache.axis.AxisFault;
      import org.apache.axis.MessageContext;
      import org.apache.axis.handlers.BasicHandler;
      
      public class SOAPLogHandler extends BasicHandler {
      
        private static final String AXIS = "AXIS";
        private static final String AXIS_FAULT = "AXIS FAULT";
        private static Logger LOG = LoggerFactory.getLogger(SOAPLogHandler.class);
        private static final long serialVersionUID = 1;
      
        @Override
        public void invoke(MessageContext msgContext) throws AxisFault {
          logMessage(AXIS, msgContext);
        }
      
        @Override
        public void onFault(MessageContext msgContext) {
          try {            
              logMessage(AXIS_FAULT,msgContext);
          } catch (AxisFault axisFault) {
              LOG.error("Error on logging messages ",axisFault);
          }
        }
      
        private void logMessage(String preamble, MessageContext msgContext) throws AxisFault {
          if (msgContext.getResponseMessage() != null && msgContext.getResponseMessage().getSOAPPart() != null) {
              LOG.info("{} Response ={}",preamble ,msgContext.getResponseMessage().getSOAPPartAsString());
              return;
          }
      
          if (msgContext.getRequestMessage() != null && msgContext.getRequestMessage().getSOAPPartAsString() != null) {
              LOG.info("{} Request={}",preamble,msgContext.getRequestMessage().getSOAPPartAsString());
          }
        }
      }
      

      在全局配置请求流中设置handler也是强制的,在wsdd文件中会是这样的:

      <globalConfiguration>     
        <requestFlow>
          <handler type="log" />
        </requestFlow>
        <responseFlow>
          <handler type="log" />
        </responseFlow>
      </globalConfiguration>
      
      <handler name="log" type="java:your.package.SOAPLogHandler"/>
      

      【讨论】:

        【解决方案6】:

        Axis 默认检查文件 client-config.wsdd。我们需要将此文件保存在与 log4j.xml 或 log4j.properties 相同的位置。日志文件将在日志处理程序指定的位置生成。确保文件夹结构存在。

        mukesh

        【讨论】:

        • 不知道这种默认行为。感谢您的信息!
        猜你喜欢
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 2014-12-20
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多