在AXIS 1.x中,我如何用Log4J SOAP请求和响应来记录?[英] How can I log with Log4J SOAP request and response in AXIS 1.x?

本文是小编为大家收集整理的关于在AXIS 1.x中,我如何用Log4J SOAP请求和响应来记录?的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我有下一个问题:

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

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

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

有人知道一种使我的log4j记录请求/响应的方法吗?

推荐答案

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

我做了一个类,可以扩展抽象类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());
        }    
    }
}  }

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

1st添加处理程序

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

这样,应该完成魔术,您应该从请求/响应中收到漂亮的日志!

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

其他推荐答案

与log4j.properties一样,将此文件保存在工作目录中.

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

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

其他推荐答案

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

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

someLogAppender可能是现有的log4j appender,或者您可能需要定义一个专用的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>

本文地址:https://www.itbaoku.cn/post/1574770.html

问题描述

I am having the next problem:

I want to log the SOAP requests/responses that land on my web service (server side). Trying to configure my web service in the wsdd file. I am always landing on pages like the next one:

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

Which recommends to configure the Apeche Axis LogHandler to log the request/response. That is not valid for me, since a)there is no way to link the log4j there, and b)I just am not able to make it work.

Does anyone know a way to make my log4j to log the request/responses?

推荐答案

So after hours or Googling out there in the web, I decided to get adventurous and program my own handler. Is much easier than expected.

I made a class that extends the abstract class BasicHandler (org.apache.axis.handlers.BasicHandler), and implements the invoke method loging the request or the response. Here is my class, which I have baptized as 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());
        }    
    }
}  }

The idea is, to log first the request, and when processed, log the response. So, in the server-config.wsdd (or the wsdd file from your client if you are in the client side), we have to add a handler pointing to that class, and configure it to uses in the request/response chain:

1st add the handler

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

2nd add the use of that handler to the request/response from the http transport (focus on the log handler)

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

With that, the magic should be done, and you should receive a pretty log from the request/responses!

Disclaimer: I am not really sure from what will happend if you use some kind of SOAP multipart thing.

其他推荐答案

Save this file as "client-config.wsdd" in the working directory as you do for log4j.properties .

If you don't want to alter any code and debug your axis web service client, you can follow this method to log all incoming and outgoing soap messages.

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

其他推荐答案

You need to add an Axis logger in your log4.xml configuration file, like below:

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

someLogAppender may be an existing Log4J appender, or you may want to define a dedicated one, like below:

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