web-dev-qa-db-ja.com

Log4J SOAPリクエストとレスポンスをAXIS 1.xで記録するにはどうすればよいですか?

私は次の問題を抱えています:

SOAP Webサービス(サーバー側)に到達する要求/応答)をログに記録したい。wsddファイルでWebサービスを構成しようとしています。常に次のようなページに到達しています:

org.Apache.axis.handlers.LogHandlerの使用方法

Apeche Axis LogHandlerを構成してリクエスト/レスポンスをログに記録することをお勧めします。 a)log4jをそこにリンクする方法がなく、b)それを機能させることができないので、それは私には有効ではありません。

誰でも私のlog4jにリクエスト/レスポンスを記録させる方法を知っていますか?

14
raspayu

それで、何時間か、またはWebでグーグルしてから、私は冒険して自分のハンドラーをプログラムすることにしました。予想よりはるかに簡単です。

抽象クラスBasicHandler(org.Apache.axis.handlers.BasicHandler)を拡張し、要求または応答をログに記録するinvokeメソッドを実装するクラスを作成しました。 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ファイル)に、そのクラスを指すハンドラーを追加し、要求/応答チェーン:

最初にハンドラーを追加する

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

2番目に、そのハンドラーの使用を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マルチパートのものを使用した場合にどうなるかは、私にはよくわかりません。

34
raspayu

Log4j.propertiesの場合と同様に、このファイルを「client-config.wsdd」として作業ディレクトリに保存します。

コードを変更せず、Axis Webサービスクライアントをデバッグしたくない場合は、このメソッドに従ってすべての着信および発信SOAPメッセージをログに記録できます。

<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

以下のように、log4.xml構成ファイルにAxisロガーを追加する必要があります。

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

私はその古いスレッドを知っていますが、答えを探している人には役立つかもしれません。

AXIS-1サーバー側のログの場合、以下のように_server-config.wsdd_を更新します。 _server-config.wsdd_は、warファイルの_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)メソッドをオーバーライドします。

4

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"/>
2
Bruno

デフォルトでは、Axisはファイルclient-config.wsddをチェックしています。このファイルをlog4j.xmlまたはlog4j.propertiesと同じ場所に保持する必要があります。ログファイルは、ログハンドラーで指定された場所に生成されます。フォルダー構造が存在することを確認してください。

mukesh

1
MukeshKoshyM