Подтвердить что ты не робот

Как я могу регистрироваться с запросом и ответом SOAP Log4J в AXIS 1.x?

У меня возникает следующая проблема:

Я хочу зарегистрировать SOAP-запросы/ответы, которые приземляются на моей веб-службе (на стороне сервера). Попытка настроить мою веб-службу в файле wsdd. Я всегда нахожусь на страницах вроде следующего:

Как использовать org.apache.axis.handlers.LogHandler

Что рекомендует настроить Apeche Axis LogHandler для регистрации запроса/ответа. Это недействительно для меня, так как a) нет возможности связать log4j, и b) я просто не могу заставить его работать.

Кто-нибудь знает способ сделать мой log4j для регистрации запроса/ответов?

4b9b3361

Ответ 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