Отключить ведение журнала HttpClient - PullRequest
119 голосов
/ 06 февраля 2011

Я использую commons-httpclient 3.1 в комплекте интеграционных тестов.Журнал по умолчанию для HttpClient очень шумный, и я не могу его отключить.Я пытался следовать инструкциям здесь , но ни одна из них не имеет никакого значения.

В основном мне просто нужно закрыть регистратор org.apache.http.wire.Частично проблема в том, что я не знаю, какой тип регистратора пытается использовать HttpClient, и большая часть проблемы в том, что я никогда раньше не использовал эту библиотеку.Я попытался создать файл log4j.properties и поместить его в мою папку test / resources, изменить главный файл logging.properties в jre / lib и отправить в Maven различные параметры ведения журнала, как указано на странице logging * 1006.*, и ни один из них не имеет никакого значения.

Любая помощь приветствуется ... это сводит меня с ума.

ОБНОВЛЕНИЕ: Исправление: появляется выводНа самом деле речь идет о том, что jwebunit использует HttpClient, а не мой собственный.В любом случае, это нежелательно.

ОБНОВЛЕНИЕ: Спасибо за попытки до сих пор.Я попробовал все предложенное ниже, но все равно не повезло.У меня есть файл commons-logging.properties в моей папке src / test / resources со следующим содержимым

org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
log4j.configuration=log4j.properties

и файл log4j.properties в той же папке со следующим содержимым

log4j.rootLogger=ERROR, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n

#This is the line that should make httpclient shut up
log4j.logger.org.apache.http=ERROR

Однако, когда я запускаю свои тесты, я все равно получаю кучу выходных данных, таких как:

21:57:41.413 [main] DEBUG org.apache.http.wire - << "                                   [\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "                                   [\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "                               </ul>[\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "    [\n]"
21:57:41.424 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "                   </div>[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "                </li>[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "            [\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "            [\r][\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "        </ul>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "<div class="details">[\n]"
21:57:41.442 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-body details-precis  ">[\n]
"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-state">[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
Destroying 1 processes21:57:41.465 [main] DEBUG org.apache.http.wire - << "[\r][\n]"

Этот вывод для всего, что встречается по проводам, делает эту библиотеку непригодной для меня ... то естьпока я не могу понять, как его выключить.Что-нибудь особенное, что мне нужно сделать, чтобы прочитать эту конфигурацию журнала?

Ответы [ 26 ]

78 голосов
/ 23 мая 2011

Обновление log4j.properties включает:

log4j.logger.httpclient.wire.header=WARN
log4j.logger.httpclient.wire.content=WARN

Обратите внимание, что если библиотека Log4j не установлена, HttpClient (и, следовательно, JWebUnit) будет использовать logback.В этой ситуации создайте или отредактируйте logback.xml, включив в него:

<configuration>
    <logger name="org.apache" level="WARN" />
    <logger name="httpclient" level="WARN" /> 
</configuration>

Установка уровня журнала на WARN с Log4j с использованием имени пакета org.apache.commons.httpclient в log4j.properties не работает как ожидалось:

log4j.logger.org.apache.commons.httpclient=WARN

Это связано с тем, что источник HttpClient (v3.1) использует следующие имена журналов:

public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header"));
public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content"));
26 голосов
/ 07 февраля 2011

Примечание. Некоторые из этих ответов могут повторять то, что вы уже знаете (или думаете, что знаете), но в этом вопросе есть немного неверной информации, поэтому я собираюсь начать с самого начала и все по буквам

  • Commons HttpClient использует Commons-Logging для всех своих нужд регистрации.
  • Commons-Logging - это не полная структура ведения журнала, а оболочка вокруг нескольких существующих сред ведения журнала
  • Это означает, что когда вы хотите управлять выводом журнала, вы (в основном) в конечном итоге настраиваете библиотеку, отличную от Commons-Logging, , но , потому что Commons-Logging охватывает несколько других библиотек, это трудно нам нужно угадать, какой из них настроить, не зная ваших настроек.
  • Commons-Logging может регистрироваться в log4j, но также может регистрироваться в java.util.logging (регистрация JDK1.4)
  • Commons-Logging пытается проявить смекалку, угадать, какую платформу ведения журналов вы уже используете, и отправить свои журналы на это.
  • Если у вас еще нет каркаса журналирования, и вы работаете на JRE версии 1.4 или выше (что и должно быть), то он, вероятно, будет отправлять свои сообщения журнала в журналирование JDK (java.util.logging)
  • Использование механизма автоматического обнаружения Commons-Logging подвержено ошибкам. Простое добавление log4j.jar в путь к классу заставит его переключать используемый механизм ведения журнала, что, вероятно, не то, что вам нужно
  • Желательно, чтобы вы явно указали Commons-Logging, какую библиотеку журналов использовать
  • Вы можете сделать это, создав commons-logging.properties файл согласно этим инструкциям
  • Чтобы настроить ведение журнала commons-httpclient, необходимо выполнить следующие шаги:
    1. Решите, какую базовую структуру ведения журналов вы хотите использовать. Есть несколько вариантов, но, вероятно, log4j или java.util.logging являются лучшими для вас.
    2. Настройте файл свойств commons-logging так, чтобы он указывал на правильную реализацию Log. например чтобы использовать log4j, поместите это в файл свойств: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger или используйте набор журналирования JDK org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger. Они также могут быть установлены как системные свойства (например, используя -D в командной строке).
    3. Сконфигурируйте базовую реализацию ведения журнала (например, log4j), чтобы игнорировать нежелательные сообщения и выводить нужные сообщения.

Это много шагов, но это то, что нужно. Разработчики Apache-commons склонны считать, что у вас уже настроена среда ведения журналов, и они могут определить, какая она есть, путем автоматического обнаружения.
Если это не так для вас, то, как правило, требуется больше работы для запуска.

18 голосов
/ 26 апреля 2011

Я поместил это в мой файл конфигурации log4j

log4j.logger.org.apache.http.wire=WARN

Это ограничивает вывод до уровня предупреждения или выше

16 голосов
/ 25 марта 2011

Это сработало для моих тестов;

java.util.logging.Logger.getLogger("org.apache.http.wire").setLevel(java.util.logging.Level.FINEST);
java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST);
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "ERROR");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "ERROR");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "ERROR");
14 голосов
/ 21 февраля 2014

Для log4j добавьте следующее в log4j.properties (в каталоге source приложения):

log4j.logger.org.apache=WARN
log4j.logger.httpclient=WARN

Для входа в систему следующее logback.xml убьет шум:

<configuration>
    <logger name="org.apache" level="WARN" />
    <logger name="httpclient" level="WARN" /> 
</configuration>
11 голосов
/ 20 января 2012

Потребовалось слишком много времени, чтобы выяснить это, но JWebUnit поставляется с компонентом ведения журнала Logback , поэтому он даже не использует log4j.properties или commons-logging.properties.

Вместо этого создайте файл с именем logback.xml и поместите его в папку с исходным кодом (в моем случае src):

<configuration debug="false">
  <!-- definition of appender STDOUT -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="ERROR">
    <!-- appender referenced after it is defined -->
    <appender-ref ref="STDOUT"/>
  </root> 
</configuration>

Похоже, что Logback все еще находится в стадии разработки, а API, похоже, все еще меняется, поэтому в будущем этот пример кода может потерпеть неудачу. См. Также этот вопрос StackOverflow .

8 голосов
/ 04 октября 2011

Мы используем XML, а не файл свойств, чтобы сконфигурировать наш вывод журнала. Следующий код работал, чтобы заставить замолчать эту болтовню.

<logger name="org.apache.commons.httpclient">
    <level value="fatal"/>
</logger>

<logger name="httpclient.wire.header">
    <level value="fatal"/>
</logger>

<logger name="httpclient.wire.content">
    <level value="fatal"/>
</logger>
5 голосов
/ 04 марта 2019

У меня была эта проблема при использовании RestAssured с JUnit. Для меня этот программный подход сработал:

@BeforeClass
public static void setUpClass() {
    ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger("org.apache.http");
    root.setLevel(ch.qos.logback.classic.Level.INFO);

    //...
}
4 голосов
/ 17 мая 2012

Простой способ Log4j и HttpCLient (v3.1 в этом случае должен работать выше, может потребовать незначительных изменений)

Убедитесь, что все зависимости верны, и MD5 ваши загрузки !!!!

import org.apache.commons.httpclient.HttpClient;  
import org.apache.log4j.Level;  
import org.apache.log4j.Logger;  

---

Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.WARN);
Logger.getLogger("httpclient.wire.header").setLevel(Level.WARN);
Logger.getLogger("httpclient.wire.content").setLevel(Level.WARN);

HttpClient client = new HttpClient();
4 голосов
/ 05 ноября 2014

Я уже давно страдаю от этой проблемы и, наконец, решил разобраться в этом. Выяснилось, что проблема в том, что мой проект зависел от http-builder-0.5.2.jar, который связывал файл log4j.xml внутри себя. И, конечно же, уровень журнала для org.apache.http.wire был DEBUG! То, как я нашел это, было просто просмотреть все файлы jar в моих зависимостях и выполнить "jar tvf" и поиск log4j.

Хотя это открытие привело к возможному решению повысить версию моей зависимости http-builder до 0,6, оно все еще сбивает с толку то, что, должно быть, пришло в голову разработчику при объединении файла log4j.xml в файл jar. Во всяком случае, это, вероятно, не имеет отношения к этой теме на данный момент. Но я подумал, что полезно упомянуть об этом решении, которое я нашел, учитывая, что когда я искал решение до сих пор, мое никогда не подходило. Надеюсь, кто-то найдет это полезным.

...