Перейти к основному содержимому

Включение ведения журнала для Apache HttpClient

· 4 мин. чтения

1. Обзор

В этом руководстве мы покажем, как включить ведение журнала в HttpClient Apache . Кроме того, мы объясним, как ведение журнала реализовано внутри библиотеки. После этого мы покажем, как включить различные уровни ведения журнала.

2. Реализация ведения журнала

Библиотека HttpClient предоставляет эффективную, актуальную и многофункциональную реализацию клиентского сайта протокола HTTP.

Действительно, как библиотека, HttpClient не требует обязательной реализации ведения журнала . С этой целью версия 4.5 предоставляет журналы с помощью Commons Logging . Точно так же последняя версия 5.1 использует фасад ведения журнала, предоставленный SLF4J . Обе версии используют схему иерархии для сопоставления регистраторов с их конфигурациями.

Благодаря этому можно настроить регистраторы для отдельных классов или для всех классов, связанных с одной и той же функциональностью.

3. Типы журналов

Давайте посмотрим на уровни журнала, определенные библиотекой. Мы можем выделить 3 типа журналов:

  • ведение журнала контекста — регистрирует информацию обо всех внутренних операциях HttpClient. Он также содержит журналы проводов и заголовков.
  • Wire logging — регистрирует только данные, передаваемые на сервер и с сервера
  • ведение журнала заголовков — регистрирует только заголовки 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));
}
}
}

Тест выбирает фиктивную веб-страницу и печатает содержимое в журнал.

Давайте теперь определим конфигурацию регистратора с помощью нашего файла 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.foreach.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. Во-первых, мы объяснили, как ведение журнала реализовано в библиотеке. Во-вторых, мы настроили ведение журнала в двух версиях и выполнили простые тестовые примеры, чтобы показать результат.

Как всегда, исходный код примера доступен на GitHub .