2012-09-28 10 views
13

Sto avendo il prossimo problema:Come posso accedere con richiesta SO4 Log4J e risposta in AXIS 1.x?

Desidero registrare le richieste/risposte SOAP che arrivano sul mio servizio web (lato server). Sto cercando di configurare il mio servizio web nel file wsdd. Sono sempre sbarco sulla pagine come la prossima:

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

che raccomanda di configurare l'Apeche Axis LogHandler per registrare i richiesta/risposta. Questo non è valido per me, dal momento che a) non c'è modo di collegare il log4j lì, e b) semplicemente non sono in grado di farlo funzionare.

Qualcuno conosce un modo per fare in modo che log4j registri la richiesta/le risposte?

risposta

31

Quindi, dopo ore o ricerche su Google nel web, ho deciso di diventare avventuroso e programmare il mio stesso gestore. È molto più facile del previsto

Ho creato una classe che estende la classe astratta BasicHandler (org.apache.axis.handlers.BasicHandler) e implementa il metodo invoke che registra la richiesta o la risposta. Qui è la mia classe, che ho battezzato come 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'idea è, prima di accedere alla richiesta, e quando viene elaborato, log la risposta. Quindi, nel server server-config.wsdd (o nel file wsdd dal client se si è nel lato client), dobbiamo aggiungere un gestore che punta a quella classe e configurarlo per gli usi nella catena richiesta/risposta :

prima aggiungere il gestore

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

2 ° aggiungere l'uso di tale gestore per la richiesta/risposta dal trasporto HTTP (focus sul gestore di log)

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

Con questo, il la magia dovrebbe essere fatta e dovresti ricevere un bel log dalla richiesta/risposte!

Disclaimer: Non sono sicuro di cosa accadrà se si utilizza una specie di cosa multipart SOAP.

+0

Ho trovato il tuo post molto utile. Sto lottando per ottenere la risposta XML. Sono in grado di ottenere la richiesta, ma la risposta SOAP non si ottiene, infatti il ​​metodo invoke sta invocando solo in fase di richiesta. Ho fatto tutte le configurazioni suggerite.Inoltre, quando aggiungo le voci nella configurazione globale per la richiesta e la risposta, solo ricevo sia la richiesta che la risposta ma all'interno del tag di trasporto, sto ricevendo solo la richiesta e nessuna risposta. – Jayesh

+0

Sto usando TestNG e selenio. Dove dovrei aggiungere il gestore? In pom.xml o TestNG.xml? – R11G

+0

Ho trovato questa risposta molto utile ma con questo non riesco a registrare soapfault (eccezione). Si prega di suggerire un modo per fare lo stesso.ho tag faultFlow ma non funziona –

14

Salva questo file come "client-config.wsdd" nella directory di lavoro come per log4j.properties.

Se non si desidera modificare alcun codice e eseguire il debug del client del servizio Web asse, è possibile seguire questo metodo per registrare tutti i messaggi di sapone in entrata e in uscita.

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

È venuto a conoscenza di questo problema durante la risoluzione dei problemi di ColdFusion 11 installazione che stava chiamando .NET WebServices e continuava a ricevere "java.net.ConnectException: Connection refused". Ciò mi ha aiutato a rintracciarlo in uno spazio dei nomi predefinito errato nella busta SOAP. (usa "mx.webservices"). – TomEberhard

1

L'asse per impostazione predefinita verifica il file client-config.wsdd. Dobbiamo mantenere questo file nella posizione uguale a log4j.xml o log4j.properties. Il file di registro verrà generato nella posizione specificata nel gestore di registri. Assicurarsi che la struttura della cartella esista.

mukesh

+0

Non conoscevo questo comportamento predefinito. Grazie per le informazioni! – raspayu

8

è necessario aggiungere un logger di Axis nel file di configurazione log4.xml, come di seguito:

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

someLogAppender può essere un appender Log4J esistente, oppure si può decidere di definire uno dedicato, come di seguito:

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

Avvio a molla: basta aggiungere 'logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG' nel file application.properties – CelinHC

4

So che è un thread vecchio, ma può essere utile per le persone in cerca di risposte.

Per la registrazione laterale del server AXIS-1, aggiornare server-config.wsdd come di seguito. server-config.wsdd è nella cartella WEB-INF del file di guerra.

Un nuovo gestore per il registro. Il nome del file insieme al percorso è configurabile.

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

È inoltre possibile utilizzare il parametro LogHandler.writeToConsole con il valore come "true" effettuare il login nel vostro registro della console.

Poi aggiornare la sezione <globalConfiguration> di avere

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

Se la requestFlow e responseFlow contiene altri gestori, mettere il registro come il primo gestore.

Questo dovrebbe essere utilizzato solo per scopi di debug non di produzione. Poiché la registrazione è ingenua e fa la normale operazione di scrittura sul file senza alcun buffer. In secondo luogo, il file di registro crescerà in GB, poiché non esiste un meccanismo di rollover.

Per la registrazione lato client AXIS-1, aggiornare client-config.wsdd come di seguito. Il client-config.wsdd dovrebbe entrare nel tuo classpath direttamente sotto una cartella radice configurata nel classpath non in qualsiasi sottocartelle. La posizione migliore è la stessa directory in cui è presente il file log4j.xml o log4j.properties (grazie al post di #MukeshKoshyM sopra).

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

Lo stesso problema menzionato per la registrazione lato server è applicabile anche per il lato client.

Per la produzione, scrivere il proprio gestore di registri estendendo org.apache.axis.handlers.BasicHandler e configurare il file di classe nel gestore. Si prega di guardare la risposta di cui sopra da #raspayu per configurare il proprio. Per registrare gli errori, sostituire il metodo public void onFault(MessageContext msgContext) nel gestore.

2

Una soluzione per registrare i guasti Axis è estendere il metodo 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()); 
    } 
    } 
} 

E 'inoltre obbligatorio impostare il gestore nel flusso di richiesta di configurazione globale, nel file WSDD sarà qualcosa di simile:

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

<handler name="log" type="java:your.package.SOAPLogHandler"/>