2012-09-28 8 views
13

Mam następny problem:Jak mogę logować się przy pomocy żądania Log4J SOAP i odpowiedzi w AXIS 1.x?

Chcę rejestrować żądania/odpowiedzi SOAP, które wylądują w mojej usłudze sieciowej (po stronie serwera). Próbuję skonfigurować moją usługę sieciową w pliku wsdd. Ja zawsze lądowania na stronach jak następny:

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

którym zaleca się, aby skonfigurować Apeche Axis LogHandler rejestrować żądanie/odpowiedź. Nie jest to dla mnie ważne, ponieważ a) nie ma sposobu na połączenie log4j tam, i b) Po prostu nie jestem w stanie sprawić, żeby działało.

Czy ktoś wie sposób, aby mój log4j do logowania żądania/odpowiedzi?

Odpowiedz

31

Więc po godzinach lub w Google, zdecydowałem się wyruszyć na poszukiwanie przygód i zaprogramować własnego handlarza. Jest o wiele łatwiej niż się spodziewano.

że wykonany klasę, która rozciąga się na klasy abstrakcyjnej BasicHandler (org.apache.axis.handlers.BasicHandler) i realizuje sposób invoke zakładania konta żądania lub odpowiedzi. Oto moja klasa, która mam ochrzczony jako 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()); 
     }  
    } 
} } 

Chodzi o to, aby zalogować się pierwszy wniosek, a po przetworzeniu zalogować odpowiedź. Tak więc w pliku server-config.wsdd (lub pliku wsdd od klienta, jeśli znajdujesz się po stronie klienta), musimy dodać program obsługi wskazujący tę klasę i skonfigurować go do użycia w łańcuchu żądania/odpowiedzi :

1-ty dodanie obsługi

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

2-ty dodać stosowanie tej obsługi na żądanie/odpowiedź z transportu hTTP (koncentrować się na obsługi dziennika)

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

z tym, magia powinna być zrobiona, a ty powinieneś otrzymać ładny log z żądania/odpowiedzi!

Nota prawna: Nie jestem naprawdę pewien, co się stanie, jeśli użyjesz czegoś wieloczęściowego.

+0

Mój wpis był bardzo pomocny. Walczę o uzyskanie odpowiedzi XML. Jestem w stanie uzyskać żądanie, ale odpowiedź SOAP nie jest uzyskiwana, metoda invact inact wywołuje tylko na żądanie fazy. Mam całą sugerowaną konfigurację.Ponadto, gdy dodaję wpisy w konfiguracji globalnej dla żądania i odpowiedzi, tylko otrzymuję zarówno żądanie, jak i odpowiedź, ale wewnątrz znacznika transportu, otrzymuję tylko żądanie i brak odpowiedzi. – Jayesh

+0

Używam TestNG i Selenium. Gdzie powinienem dodać handler? W pom.xml lub TestNG.xml? – R11G

+0

Znalazłem tę odpowiedź bardzo przydatne, ale z tym nie jestem w stanie zalogować soapfault (wyjątek). Proszę zasugerować sposób na to samo.Mam znacznik faultFlow, ale to nie działa –

14

Zapisz ten plik jako "client-config.wsdd" w katalogu roboczym tak jak w przypadku log4j.properties.

Jeśli nie chcesz zmieniać żadnego kodu i debugować swojego klienta usługi internetowej osi, możesz skorzystać z tej metody, aby rejestrować wszystkie przychodzące i wychodzące wiadomości mydlane.

<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

Przyszedł na ten problem podczas rozwiązywania problemów z ColdFusion 11 instalacja, która wywoływała .NET WebServices, i ciągle otrzymywała "java.net.ConnectException: Connection rejectedused". Pomogło mi to śledzić do niewłaściwej domyślnej przestrzeni nazw w kopercie SOAP. (używa "mx.webservices"). – TomEberhard

1

Osi domyślnie sprawdza plik client-config.wsdd. Musimy zachować ten plik w miejscu takim samym, jak log4j.xml lub log4j.properties. Plik dziennika zostanie wygenerowany w lokalizacji określonej w instrukcji obsługi dziennika. Upewnij się, że struktura folderów istnieje.

mukesh

+0

Nie wiedziałem o tym domyślnym zachowaniu. Dzięki za informację! – raspayu

8

Trzeba dodać rejestrator Axis w pliku konfiguracyjnym log4.xml, jak poniżej:

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

someLogAppender może być istniejąca Log4J appender, czy może chcesz zdefiniować dedykowanego jeden, jak poniżej:

<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

Wiosenny start: po prostu dodaj 'logging.level.org.apache.axis.transport.http.HTTPSender = DEBUG' w pliku application.properties – CelinHC

4

Znam jej stary wątek, ale może być przydatny dla osób szukających odpowiedzi.

W przypadku rejestrowania po stronie serwera AXIS-1 zaktualizuj swój numer server-config.wsdd, jak poniżej. server-config.wsdd znajduje się pod folderem Twojego pliku wojennego pod numerem WEB-INF.

Nowa funkcja obsługi dziennika. Nazwa pliku wraz ze ścieżką jest konfigurowalna.

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

Można również użyć parametru LogHandler.writeToConsole o wartości co "true" do logowania w dzienniku konsoli.

następnie zaktualizować sekcja <globalConfiguration> mieć

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

Jeśli requestFlow i responseFlow zawiera inne ładowarki, umieścić dziennik jako pierwszy obsługi.

Powinny być używane wyłącznie do celów debugowania, a nie do produkcji. Ponieważ rejestrowanie jest naiwne i wykonuje normalną operację zapisu w pliku bez bufora. Po drugie, plik dziennika wzrośnie do GB, ponieważ nie ma mechanizmu rolowania.

W celu rejestrowania po stronie klienta AXIS-1 zaktualizuj swój numer client-config.wsdd, jak poniżej. Numer client-config.wsdd powinien należeć do twojego classpath bezpośrednio pod folderem głównym skonfigurowanym w classpath, nie w żadnych podfolderach. Najlepszą lokalizacją jest ten sam katalog, w którym znajduje się plik log4j.xml lub log4j.properties (dzięki #MukeshKoshyM post powyżej).

Ten sam problem, o którym mowa w przypadku rejestrowania po stronie serwera, dotyczy również strony klienta.

W przypadku produkcji należy napisać własną procedurę obsługi dziennika, rozszerzając numer org.apache.axis.handlers.BasicHandler i konfigurując plik klasy w module obsługi. Sprawdź powyższą odpowiedź z #raspayu, aby skonfigurować własną. Aby zarejestrować błędy, należy zastąpić metodę public void onFault(MessageContext msgContext) w programie obsługi.

2

Rozwiązaniem zalogować wady oś jest rozszerzenie metody 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()); 
    } 
    } 
} 

Jest również obowiązkowe, aby ustawić obsługi w globalnym przepływie żądanie konfiguracji w pliku wsdd będzie coś takiego:

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

<handler name="log" type="java:your.package.SOAPLogHandler"/> 
Powiązane problemy