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 .