Как я могу регистрироваться с запросом и ответом SOAP Log4J в AXIS 1.x?
У меня возникает следующая проблема:
Я хочу зарегистрировать SOAP-запросы/ответы, которые приземляются на моей веб-службе (на стороне сервера). Попытка настроить мою веб-службу в файле wsdd. Я всегда нахожусь на страницах вроде следующего:
Как использовать org.apache.axis.handlers.LogHandler
Что рекомендует настроить Apeche Axis LogHandler для регистрации запроса/ответа. Это недействительно для меня, так как a) нет возможности связать log4j, и b) я просто не могу заставить его работать.
Кто-нибудь знает способ сделать мой log4j для регистрации запроса/ответов?
Ответы
Ответ 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 вашего клиента, если вы находитесь на стороне клиента), мы должны добавить обработчик, указывающий на этот класс, и настроить его на использование в цепочка запроса/ответа:
1 добавьте обработчик
<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.
Ответ 2
Сохраните этот файл как "client-config.wsdd" в рабочем каталоге, как и для log4j.properties.
Если вы не хотите изменять какой-либо код и отлаживать клиентский веб-сервис оси, вы можете следовать этому методу, чтобы регистрировать все входящие и исходящие сообщения для мыла.
<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>
Ответ 3
Вам нужно добавить регистратор Axis в конфигурационный файл log4.xml
, как показано ниже:
<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>
Ответ 4
Я знаю его старый поток, но может быть полезен для людей, которые ищут ответы.
Для ведения журнала на стороне сервера 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
со значением "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)
в обработчике.
Ответ 5
Решение для регистрации ошибок Axis распространяется на метод 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"/>
Ответ 6
Ось по умолчанию проверяет файл client-config.wsdd. Нам нужно сохранить этот файл в том же месте, что и log4j.xml или log4j.properties. Файл журнала будет сгенерирован в месте, указанном в обработчике журнала. Убедитесь, что структура папки существует.
mukesh