1. 概要

このチュートリアルでは、ApacheのHttpClientロギングを有効にする方法を示します。 さらに、ライブラリ内でロギングがどのように実装されているかについても説明します。 その後、さまざまなレベルのロギングを有効にする方法を示します。

2. ロギングの実装

HttpClientライブラリは、HTTPプロトコルの効率的で、最新の、機能豊富な実装クライアントサイトを提供します。

実際、ライブラリとして、HttpClientはロギングの実装を強制しません。 この意図で、バージョン4.5は、 CommonsLoggingでログを提供します。 同様に、最新バージョンの5.1は、SLF4Jによって提供されるロギングファサードを使用します。 どちらのバージョンも、階層スキーマを使用してロガーを構成と照合します。

そのおかげで、単一のクラスまたは同じ機能に関連するすべてのクラスにロガーを設定することができます。

3. ログタイプ

ライブラリによって定義されたログレベルを見てみましょう。 3種類のログを区別できます。

  • コンテキストロギング–HttpClientのすべての内部操作に関する情報をログに記録します。 ワイヤーログとヘッダーログも含まれています。
  • ワイヤーロギング–サーバーとの間で送受信されるデータのみをログに記録します
  • ヘッダーロギング–HTTPヘッダーのみをログに記録します

バージョン4.5では、対応するパッケージ org.apache.http.impl.clientとorg.apache.http.wire、org.apache.http.headersです。

したがって、バージョン5.1では、パッケージ org.apache.hc.client5.http、org.apache.hc.client5.http.wire、およびorg.apache.hc.client5.http.headers。があります。

4. Log4j構成

両方のバージョンへのログインを有効にする方法を見てみましょう。  私たちの目的は、両方のバージョンで同じ柔軟性を実現することです。 バージョン4.1では、ログをSLF4jにリダイレクトします。 そのおかげで、さまざまなロギングフレームワークを使用できます。

4.1. バージョン4.5の構成

httpclient依存関係を追加しましょう。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.8</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>

jul-to-slf4j を使用して、ログをSLF4Jにリダイレクトします。 したがって、commons-loggingを除外しました。 次に、JULとSLF4Jの間のブリッジに依存関係を追加しましょう。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.26</version>
</dependency>

SLF4Jは単なるファサードであるため、バインディングが必要です。 この例では、logbackを使用します。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

次に、ApacheHttpClientUnitTestクラスを作成しましょう。

public class ApacheHttpClientUnitTest {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    public static final String DUMMY_URL = "https://postman-echo.com/get";

    @Test
    public void whenUseApacheHttpClient_thenCorrect() throws IOException {
        HttpGet request = new HttpGet(DUMMY_URL);

        try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = client.execute(request)) {
            HttpEntity entity = response.getEntity();
            logger.debug("Response -> {}",  EntityUtils.toString(entity));
        }
    }
}

テストでは、ダミーのWebページをフェッチし、その内容をログに出力します。

次に、logback.xmlファイルを使用してロガー構成を定義しましょう。

<configuration debug="false">
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date [%level] %logger - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="com.baeldung.httpclient.readresponsebodystring" level="debug"/>
    <logger name="org.apache.http" level="debug"/>

    <root level="WARN">
        <appender-ref ref="stdout"/>
    </root>
</configuration>

テストを実行した後、すべてのHttpClientのログがコンソールに表示されます。

...
2021-06-19 22:24:45,378 [DEBUG] org.apache.http.impl.execchain.MainClientExec - Executing request GET /get HTTP/1.1 
2021-06-19 22:24:45,378 [DEBUG] org.apache.http.impl.execchain.MainClientExec - Target auth state: UNCHALLENGED 
2021-06-19 22:24:45,379 [DEBUG] org.apache.http.impl.execchain.MainClientExec - Proxy auth state: UNCHALLENGED 
2021-06-19 22:24:45,382 [DEBUG] org.apache.http.headers - http-outgoing-0 >> GET /get HTTP/1.1 
...

4.2. バージョン5.1の構成

上位バージョンを見てみましょう。 再設計されたロギングが含まれています。 したがって、Commons Loggingの代わりに、SLF4Jを利用します。 結果として、ロガーファサードのバインディングが唯一の追加の依存関係になります。 したがって、最初の例のようにlogback-classicを使用します。

httpclient5依存関係を追加しましょう。

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.1</version>
</dependency>

前の例と同様のテストを追加しましょう。

public class ApacheHttpClient5UnitTest {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    public static final String DUMMY_URL = "https://postman-echo.com/get";

    @Test
    public void whenUseApacheHttpClient_thenCorrect() throws IOException, ParseException {
        HttpGet request = new HttpGet(DUMMY_URL);

        try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = client.execute(request)) {
            HttpEntity entity = response.getEntity();
            logger.debug("Response -> {}", EntityUtils.toString(entity));
        }
    }
}

次に、logback.xmlファイルにロガーを追加する必要があります。

<configuration debug="false">
...
    <logger name="org.apache.hc.client5.http" level="debug"/>
...
</configuration>

テストクラスApacheHttpClient5UnitTestを実行して、出力を確認してみましょう。 これは古いバージョンに似ています。

...
2021-06-19 22:27:16,944 [DEBUG] org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000000 endpoint connected 
2021-06-19 22:27:16,944 [DEBUG] org.apache.hc.client5.http.impl.classic.MainClientExec - ex-0000000001 executing GET /get HTTP/1.1 
2021-06-19 22:27:16,944 [DEBUG] org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000000 start execution ex-0000000001 
2021-06-19 22:27:16,944 [DEBUG] org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - ep-0000000000 executing exchange ex-0000000001 over http-outgoing-0 
2021-06-19 22:27:16,960 [DEBUG] org.apache.hc.client5.http.headers - http-outgoing-0 >> GET /get HTTP/1.1 
...

5. 結論

これで、ApacheのHttpClientのロギングを構成する方法に関するこの短いチュートリアルは終わりです。 最初に、ライブラリでロギングがどのように実装されているかを説明しました。 次に、2つのバージョンでロギングを構成し、出力を表示するための簡単なテストケースを実行しました。

いつものように、例のソースコードはGitHubから入手できます。