web-dev-qa-db-fra.com

Comment puis-je me connecter avec Log4J SOAP requête et réponse dans AXIS 1.x?

J'ai le prochain problème:

Je souhaite enregistrer les SOAP requêtes/réponses qui atterrissent sur mon service Web (côté serveur). J'essaie de configurer mon service Web dans le fichier wsdd. Je suis toujours sur des pages comme la suivante :

Comment utiliser l'org.Apache.axis.handlers.LogHandler

Ce qui recommande de configurer Apeche Axis LogHandler pour enregistrer la demande/réponse. Ce n'est pas valable pour moi, car a) il n'y a aucun moyen de lier le log4j là-bas, et b) je ne suis tout simplement pas en mesure de le faire fonctionner.

Est-ce que quelqu'un connaît un moyen de faire mon log4j pour enregistrer la demande/réponses?

14
raspayu

Donc, après des heures ou googler sur le Web, j'ai décidé de devenir aventureux et de programmer mon propre gestionnaire. Est beaucoup plus facile que prévu.

J'ai créé une classe qui étend la classe abstraite BasicHandler (org.Apache.axis.handlers.BasicHandler) et implémente la méthode invocation qui enregistre la demande ou la réponse. Voici ma classe, que j'ai baptisée 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());
        }    
    }
}  }

L'idée est de consigner d'abord la demande et, une fois traitée, de consigner la réponse. Donc, dans le server-config.wsdd (ou le fichier wsdd de votre client si vous êtes du côté client), nous devons ajouter un gestionnaire pointant vers cette classe et le configurer pour l'utiliser dans la chaîne de demande/réponse:

1er ajouter le gestionnaire

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

2ème ajouter l'utilisation de ce gestionnaire à la demande/réponse du transport http (focus sur le gestionnaire de journaux)

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

Avec cela, la magie devrait être faite, et vous devriez recevoir un joli journal de la demande/réponses!

Avertissement: je ne suis pas vraiment sûr de ce qui se passera si vous utilisez une sorte de chose en plusieurs parties SOAP.

34
raspayu

Enregistrez ce fichier sous "client-config.wsdd" dans le répertoire de travail comme vous le faites pour log4j.properties.

Si vous ne souhaitez modifier aucun code et déboguer votre client de service Web d'axe, vous pouvez suivre cette méthode pour consigner tous les messages soap entrants et sortants.

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

Vous devez ajouter un enregistreur Axis dans votre log4.xml fichier de configuration, comme ci-dessous:

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

someLogAppender peut être un appender Log4J existant, ou vous pouvez en définir un dédié, comme ci-dessous:

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

Je sais que c'est un vieux fil, mais peut être utile pour les personnes qui recherchent des réponses.

Pour la journalisation côté serveur AXIS-1, mettez à jour votre server-config.wsdd Comme ci-dessous. server-config.wsdd Se trouve dans le dossier WEB-INF De votre fichier de guerre.

Un nouveau gestionnaire de journal. Le nom de fichier ainsi que le chemin d'accès sont configurables.

<handler name="log" type="Java:org.Apache.axis.handlers.LogHandler">
  <parameter name="LogHandler.fileName" value="/tmp/req-res-axis.log" />
</handler>

Vous pouvez également utiliser le paramètre LogHandler.writeToConsole Avec la valeur "true" Pour vous connecter au journal de votre console.

Mettez ensuite à jour la section <globalConfiguration> Pour avoir

<requestFlow>
 <handler type="log"/>         
</requestFlow>
<responseFlow> 
 <handler type="log"/>
</responseFlow>

Si requestFlow et responseFlow contient d'autres gestionnaires, placez le journal comme premier gestionnaire.

Cela ne doit être utilisé qu'à des fins de débogage et non pour la production. Étant donné que la journalisation est naïve et effectuez l'opération d'écriture normale sur le fichier sans tampon. Deuxièmement, le fichier journal augmentera en Go car il n'y a pas de mécanisme de roulement.

Pour la journalisation côté client AXIS-1, mettez à jour votre client-config.wsdd Comme ci-dessous. Le client-config.wsdd Doit aller dans votre classpath directement sous un dossier racine configuré dans le classpath et non dans un sous-dossier. Le meilleur emplacement est le même répertoire où votre fichier log4j.xml Ou log4j.properties Est présent (Merci au message #MukeshKoshyM ci-dessus).

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

Le même problème mentionné pour la journalisation côté serveur s'applique également au côté client.

Pour la production, écrivez votre propre gestionnaire de journaux en étendant org.Apache.axis.handlers.BasicHandler Et configurez le fichier de classe dans le gestionnaire. Veuillez regarder la réponse ci-dessus de #raspayu pour configurer la vôtre. Pour consigner les erreurs, remplacez la méthode public void onFault(MessageContext msgContext) dans votre gestionnaire.

4
Ashraff Ali Wahab

Une solution pour consigner les défauts d'axe consiste à étendre la méthode 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());
    }
  }
}

Il est également obligatoire de définir le gestionnaire dans le flux de demande de configuration globale, dans le fichier wsdd sera quelque chose comme ceci:

<globalConfiguration>     
  <requestFlow>
    <handler type="log" />
  </requestFlow>
  <responseFlow>
    <handler type="log" />
  </responseFlow>
</globalConfiguration>

<handler name="log" type="Java:your.package.SOAPLogHandler"/>
2
Bruno

Par défaut, Axis recherche le fichier client-config.wsdd. Nous devons conserver ce fichier à l'emplacement identique à log4j.xml ou log4j.properties. Le fichier journal sera généré à l'emplacement spécifié sur le gestionnaire de journaux. Assurez-vous que la structure des dossiers existe.

mukesh

1
MukeshKoshyM