如何在 AXIS 1.x 中使用 Log4J SOAP 请求和响应进行日志记录?

问题描述 投票:0回答:6

我遇到下一个问题:

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

如何使用 org.apache.axis.handlers.LogHandler

建议配置 Apeche Axis LogHandler 来记录请求/响应。这对我来说无效,因为a)没有办法链接log4j,b)我无法让它工作。

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

soap log4j axis
6个回答
36
投票

因此,经过几个小时或在网络上进行谷歌搜索后,我决定冒险并编写自己的处理程序。比想象中容易得多。

我创建了一个扩展抽象类 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 多部分的东西会发生什么。


19
投票

将此文件保存为工作目录中的“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>

12
投票

您需要在

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>

6
投票

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

对于 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"
来登录控制台日志。

然后更新

<globalConfiguration>
部分以具有

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

如果

requestFlow
responseFlow
包含其他处理程序,则将日志作为第一个处理程序。

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

对于 AXIS-1 客户端日志记录,请更新您的

client-config.wsdd
,如下所示。
client-config.wsdd
应直接进入
classpath
中配置的根文件夹下的
classpath
,而不是任何子文件夹中。 最佳位置是您的
log4j.xml
log4j.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 的上述答案来配置您自己的答案。要记录错误,请覆盖处理程序中的
public void onFault(MessageContext msgContext)
方法。


3
投票

记录轴故障的解决方案是扩展 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());
    }
  }
}

还必须在全局配置请求流中设置处理程序,在 wsdd 文件中将是这样的:

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

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

1
投票

默认情况下,Axis 会检查文件

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

© www.soinside.com 2019 - 2024. All rights reserved.