2012-09-11 11 views
10

Spring MVCを介して公開されているRESTサービスがあります。 HandlerExceptionResolverを使用して例外を記録します。RESTfulな投稿データをどのように記録できますか?

  • 例外とそのスタックトレース
  • URL
  • リクエストヘッダ

を、我々はまた、のようにJSONのポストデータをログに記録することができれば、それが簡単にデバッグするだろう:私たちは現在、以下のログよくどのようにこれを得るための任意の提案?

答えて

10

読んでいるときにリクエストボディを保存し、後で例外ログに保存したデータを提供するフィルタが必要です。

春には同様のことをするAbstractRequestLoggingFilterが含まれています。あなたの問題に直接適しているわけではありませんが、あなた自身のフィルタを実装するためのリファレンスとして使用することができます。

+1

をコメントアウトする必要があります4.1.3+、あなたのMVCディスパッチャサーブレットにあなたのフィルタをマッピングすることを確認してくださいと(SPR-12477を参照)ではないと '/* 'で囲むか、あなたのリクエストは必須の' ContentCachingRequestWrapper'でラップされません。 –

+1

@LászlóvandenHoek、あなたは詳しく説明できますか?私はあなたに従わない。私は 'ContentCachingRequestWrapper'を使用していますが、要求本体は常に空の文字列です。 –

+0

@AbhijithMadhavフィルタは、URLパターンまたはサーブレットのいずれかにマッピングすることで有効になります。私が意図したことは 'AbstractRequestLoggingFilter'を'/* 'URLパターンではなくディスパッチャーにマップする必要があるということでした。 –

4

リクエスト/レスポンスのペイロードを簡単に記録する方法はありません。 Java Webフィルタを使用して、すべての要求と応答をインターセプトし、ストリームからJSONデータを読み取ることができます。しかし、1つの問題があります。ストリームからデータを読み込むと、実際のデータがストリームから使い果たされることになります。

したがって、実際の要求と応答オブジェクトのラッパーを実装する必要があります。要求された応答のコピーされたバージョンのみがログに記録されます。次のように私たちは、同様のソリューションを実装している、それが私たちの要件を満たし:

http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/

16

は、アプリケーションの構成を表すクラスにこれを追加します。

import javax.servlet.Filter; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.web.filter.AbstractRequestLoggingFilter; 

を....

@Bean 
public Filter loggingFilter(){ 
    AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() { 

     @Override 
     protected void beforeRequest(HttpServletRequest request, String message) { 
      System.out.println("beforeRequest: " +message); 
     } 

     @Override 
     protected void afterRequest(HttpServletRequest request, String message) { 
      System.out.println("afterRequest: " +message); 
     } 
    }; 
    f.setIncludeClientInfo(true); 
    f.setIncludePayload(true); 
    f.setIncludeQueryString(true); 

    f.setBeforeMessagePrefix("BEFORE REQUEST ["); 
    f.setAfterMessagePrefix("AFTER REQUEST ["); 
    f.setAfterMessageSuffix("]\n"); 
    return f; 
} 

あなたが春を使用している場合

f.setIncludePayload(true); 
関連する問題