16

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

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

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

要求/応答をログに記録するように Apeche Axis LogHandler を構成することをお勧めします。a)そこにlog4jをリンクする方法がなく、b)それを機能させることができないため、これは私には有効ではありません。

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

4

6 に答える 6

35

そのため、何時間もウェブでグーグル検索を行った後、私は冒険に出て、独自のハンドラーをプログラムすることにしました。予想よりはるかに簡単です。

抽象クラス 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 ファイル) で、そのクラスを指すハンドラーを追加し、要求/応答チェーンで使用するように構成する必要があります。

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

 <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 マルチパートを使用するとどうなるかはよくわかりません。

于 2012-09-28T10:54:03.553 に答える
11

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>
于 2014-05-20T15:12:05.513 に答える
4

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

AXIS-1 サーバー側のログについては、以下のserver-config.wsddように更新してください。warファイルのフォルダーの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.writeToConsoleas の値を持つパラメーターを使用"true"して、コンソール ログにログインすることもできます。

<globalConfiguration>次に、セクションを更新して

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

requestFlowおよびに他のハンドラが含まれている場合はresponseFlow、ログを最初のハンドラとして配置します。

これは、本番用ではなく、デバッグ目的でのみ使用する必要があります。ロギングはナイーブであるため、バッファなしでファイルに対して通常の書き込み操作を実行します。第 2 に、ロールオーバー メカニズムがないため、ログ ファイルが GB 単位まで大きくなります。

AXIS-1 クライアント側のログについては、以下のclient-config.wsddように更新してください。は、サブフォルダーではなく、構成されたルート フォルダーの直下にclient-config.wsdd移動する必要があります。最適な場所は、またはファイルが存在するディレクトリと同じです (上記の #MukeshKoshyM の投稿に感謝します)。classpathclasspathlog4j.xmllog4j.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="/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)障害をログに記録するには、Handlerのメソッドをオーバーライドします。

于 2016-01-14T16:29:12.787 に答える
2

軸フォルトをログに記録するソリューションは、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"/>
于 2016-02-15T15:58:44.887 に答える