我遇到了下一个问题:
我想记录登陆我的 Web 服务(服务器端)的 SOAP 请求/响应。尝试在 wsdd 文件中配置我的 Web 服务。我总是登陆下一个页面:
如何使用 org.apache.axis.handlers.LogHandler
其中建议配置 Apeche Axis LogHandler 来记录请求/响应。这对我无效,因为 a) 无法在此处链接 log4j,并且 b) 我只是无法使其工作。
有谁知道让我的 log4j 记录请求/响应的方法?
我遇到了下一个问题:
我想记录登陆我的 Web 服务(服务器端)的 SOAP 请求/响应。尝试在 wsdd 文件中配置我的 Web 服务。我总是登陆下一个页面:
如何使用 org.apache.axis.handlers.LogHandler
其中建议配置 Apeche Axis LogHandler 来记录请求/响应。这对我无效,因为 a) 无法在此处链接 log4j,并且 b) 我只是无法使其工作。
有谁知道让我的 log4j 记录请求/响应的方法?
因此,经过几个小时或在网上搜索后,我决定冒险并编写自己的处理程序。比预期的要容易得多。
我创建了一个扩展抽象类 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"/>
2nd将该处理程序的使用添加到来自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 多部分的东西会发生什么。
像对 log4j.properties 一样,将此文件保存为工作目录中的“client-config.wsdd”。
如果您不想更改任何代码并调试您的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>
您需要在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>
我知道它是一个旧线程,但可能对寻找答案的人有用。
对于 AXIS-1 服务器端日志记录,更新您的server-config.wsdd
如下所示。server-config.wsdd
在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
带有 as 值的参数"true"
来登录控制台日志。
然后更新该<globalConfiguration>
部分以具有
<requestFlow>
<handler type="log"/>
</requestFlow>
<responseFlow>
<handler type="log"/>
</responseFlow>
如果requestFlow
andresponseFlow
包含其他处理程序,则将日志作为第一个处理程序。
这应该只用于调试目的,而不是用于生产。由于日志记录是幼稚的,并且在没有任何缓冲区的情况下对文件执行正常的写入操作。其次,由于没有翻转机制,日志文件将增长到 GB。
对于 AXIS-1 客户端日志记录,请client-config.wsdd
在下面更新您的内容。client-config.wsdd
应该直接进入您在非任何子文件夹中配置的根文件夹下classpath
。classpath
最佳位置是您的log4j.xml
orlog4j.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)
Handler 中的方法。
记录轴故障的解决方案是扩展 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"/>
默认情况下,Axis 会检查文件 client-config.wsdd。我们需要将此文件保存在与 log4j.xml 或 log4j.properties 相同的位置。日志文件将在日志处理程序指定的位置生成。确保文件夹结构存在。
mukesh