ホームページ  >  記事  >  Java  >  効果的なデバッグのために Spring RestTemplate のリクエストとレスポンスをログに記録するにはどうすればよいですか?

効果的なデバッグのために Spring RestTemplate のリクエストとレスポンスをログに記録するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-19 01:51:02979ブラウズ

How to Log Spring RestTemplate Requests and Responses for Effective Debugging?

Spring RestTemplate のリクエストとレスポンスのデバッグ: 総合ガイド

Spring RestTemplate をデバッグする場合、リクエストとレスポンスを検査すると、貴重な洞察が得られます。 「-v」オプションを使用してcurlコマンドの詳細な出力を複製するには、RestTemplateの詳細なログ記録またはデバッグを有効にする必要があります。

1つの方法では、RestTemplateのソース コードを変更して追加のログ ステートメントを含めますが、これは主な解決策として推奨されません。代わりに、ClientHttpRequestInterceptor の機能を活用できます。

リクエスト/レスポンスのログ記録用のカスタム ClientHttpRequestInterceptor

リクエストとレスポンスの詳細の両方をログに記録するには、カスタムのClientHttpRequestInterceptor:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        traceRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        traceResponse(response);
        return response;
    }

    private void traceRequest(HttpRequest request, byte[] body) throws IOException {
        log.info("===========================request begin================================================");
        log.debug("URI         : {}", request.getURI());
        log.debug("Method      : {}", request.getMethod());
        log.debug("Headers     : {}", request.getHeaders());
        log.debug("Request body: {}", new String(body, "UTF-8"));
        log.info("==========================request end================================================");
    }

    private void traceResponse(ClientHttpResponse response) throws IOException {
        StringBuilder inputStringBuilder = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));
        String line = bufferedReader.readLine();
        while (line != null) {
            inputStringBuilder.append(line);
            inputStringBuilder.append('\n');
            line = bufferedReader.readLine();
        }
        log.info("============================response begin==========================================");
        log.debug("Status code  : {}", response.getStatusCode());
        log.debug("Status text  : {}", response.getStatusText());
        log.debug("Headers      : {}", response.getHeaders());
        log.debug("Response body: {}", inputStringBuilder.toString());
        log.info("=======================response end=================================================");
    }

}

バッファリングとインターセプターを使用した RestTemplate の構成

カスタム インターセプターを使用するには、RestTemplate を次のように構成します:

RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
restTemplate.setInterceptors(interceptors);

BufferingClientHttpRequestFactory に注意してください。インターセプターが応答本文に複数回アクセスできるようにするために必要です。

使用法と予想される出力

この構成を使用すると、restTemplate.execute() を呼び出すとログが記録されます。希望の形式でのリクエストとレスポンスの詳細:

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

log:

===========================request begin===============================================
URI         : http://someurl
Method      : PUT
Headers     : {...}
Request body: {...}
==========================request end===============================================

============================response begin==========================================
Status code  : 200
Status text  : OK
Headers      : {...}
Response body: {...}
=======================response end=================================================

この詳細なログにより、RestTemplate の対話の包括的なビューが提供され、デバッグが大幅に効率的かつ便利になります。このアプローチは、コードの変更を回避し、提供される拡張メカニズムを活用することで、この一般的なデバッグの課題に対するクリーンで柔軟なソリューションを提供します。

以上が効果的なデバッグのために Spring RestTemplate のリクエストとレスポンスをログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。