1. ホーム

[解決済み] Spring RestTemplate - リクエスト/レスポンスの完全なデバッグ/ロギングを有効にするには?

2022-04-01 12:44:15

質問

私はしばらくの間、Spring RestTemplateを使用していますが、リクエストとレスポンスをデバッグしようとしているとき、常に壁にぶつかっています。私は基本的に、"verbose"オプションをオンにしてcurlを使用したときに見るのと同じものを見たいと思っています。たとえば、次のようなものです。

curl -v http://twitter.com/statuses/public_timeline.rss

送信データと受信データ(ヘッダー、クッキーなどを含む)の両方を表示します。

私は、いくつかの関連記事をチェックしました。 Spring RestTemplateで応答を記録する方法は? しかし、私はこの問題を解決することができませんでした。

一つの方法は、実際にRestTemplateのソースコードを変更し、そこに追加のログステートメントを追加することですが、私はこのアプローチが本当に最後の手段であることを見つけるでしょう。Spring Web Client/RestTemplateに、より友好的な方法ですべてをログに記録するように指示する方法があるはずです。

私の目標は、このようなコードでできるようになることです。

restTemplate.put("http://someurl", objectToPut, urlPathValues);

そして、ログファイルやコンソールに(curlで得られるような)同じタイプのデバッグ情報を得ることができます。 これはSpring RestTemplateを使用していて問題がある人にとって非常に便利だと思います。RestTemplateの問題をデバッグするためにcurlを使用することは、(場合によっては)うまくいきません。

解決するには?

ようやく正しい方法を見つけました。 解決策の大部分は SpringとSLF4Jを設定して、ログを取得できるようにするには?

やるべきことは2つあるようです。

  1. log4j.propertiesに以下の行を追加してください。 log4j.logger.httpclient.wire=DEBUG
  2. Spring がロギング設定を無視しないようにします。

2つ目の問題は、(私の場合のように)slf4jを使用しているspring環境で起こることがほとんどです。 そのため、slf4jが使用されている場合、次の2つのことが起こることを確認してください。

  1. クラスパスにcommons-loggingライブラリがない:これはpomに除外記述子を追加することで可能です。

            <exclusions><exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    
    
  2. log4j.propertiesファイルは、springが見つける/見ることができるクラスパスのどこかに格納されています。もし、これに問題がある場合、最後の手段の解決策は、デフォルトのパッケージにlog4j.propertiesファイルを置くことです(良い習慣ではありませんが、物事があなたの期待通りに動くことを確認するためだけです)。