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

ras*_*ayu 14 axis soap log4j

我有下一个问题:

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

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

建议配置Apeche Axis LogHandler以记录请求/响应.这对我来说无效,因为a)没有办法将log4j链接到那里,而b)我只是无法使它工作.

有没有人知道让log4j记录请求/响应的方法?

ras*_*ayu 34

因此,经过几个小时或在网上搜索,我决定冒险并编程我自己的处理程序.比预期容易得多.

我创建了一个扩展抽象类BasicHandler(org.apache.axis.handlers.BasicHandler)的类,并实现了记录请求或响应的invoke方法.这是我的班级,我作为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());
        }    
    }
}  }
Run Code Online (Sandbox Code Playgroud)

我们的想法是,首先记录请求,并在处理时记录响应.因此,在服务器config.wsdd中(或您的客户端WSDD文件,如果你是在客户端),我们必须添加指向该类处理程序,并将其配置为在请求/响应链用途:

1添加处理程序

 <handler name="log" type="java:com.mypackage.axishandlers.SOAPLogHandler"/>
Run Code Online (Sandbox Code Playgroud)

第二个将该处理程序的使用添加到来自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>
Run Code Online (Sandbox Code Playgroud)

有了这个,魔术应该完成,你应该从请求/响应中收到一个漂亮的日志!

免责声明:如果您使用某种SOAP多部件,我不确定会发生什么.


小智 17

将此文件保存为工作目录中的"client-config.wsdd",就像对log4j.properties一样.

如果您不想更改任何代码并调试轴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>
Run Code Online (Sandbox Code Playgroud)


Jav*_*ome 8

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

<logger name="org.apache.axis.transport.http.HTTPSender">
   <level value="DEBUG"/>
   <appender-ref ref="someLogAppender"/>
</logger>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

  • Spring boot:只需在 application.properties 文件中添加`logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG` (3认同)

Ash*_*hab 6

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

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

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

<handler name="log" type="java:org.apache.axis.handlers.LogHandler">
  <parameter name="LogHandler.fileName" value="/tmp/req-res-axis.log" />
</handler>
Run Code Online (Sandbox Code Playgroud)

您还可以使用LogHandler.writeToConsole带有值 as 的参数"true"来登录控制台日志。

然后更新该<globalConfiguration>部分以具有

<requestFlow>
 <handler type="log"/>         
</requestFlow>
<responseFlow> 
 <handler type="log"/>
</responseFlow>
Run Code Online (Sandbox Code Playgroud)

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

这应该仅用于调试目的而不是用于生产。由于日志记录很简单,并且在没有任何缓冲区的情况下对文件执行正常的写入操作。其次,由于没有翻转机制,日志文件将增长到 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>
Run Code Online (Sandbox Code Playgroud)

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

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