Отключить ведение журнала HttpClient

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

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

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

ОБНОВЛЕНИЕ: Коррекция: кажется, что этот вывод фактически возникает из-за использования 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]"

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

Ответ 1

Обновить 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"));

Ответ 2

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

  • 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, - это
    • Решите, какую базовую структуру ведения журнала вы хотите использовать. Есть несколько вариантов, но, вероятно, log4j или java.util.logging - лучшие варианты для вас.
    • Настройте файл свойств 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 в командной строке).
    • Настроить базовую реализацию ведения журнала (например, log4j), чтобы игнорировать сообщения, которые вы не хотите, и выводить нужные сообщения.

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

Ответ 3

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

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

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

Ответ 4

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

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");

Ответ 5

Для 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>

Ответ 6

Потребовалось слишком много времени, чтобы выяснить это, но 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, похоже, все еще меняется, поэтому в будущем этот пример кода может потерпеть неудачу. Смотрите также fooobar.com/questions/55803/....

Ответ 7

Мы используем 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>

Ответ 8

У меня была эта проблема при использовании 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);

    //...
}

Ответ 9

В вашем файле log4.properties - есть ли у вас такой набор, как я делаю ниже, и никаких других в файле?

-org.apache.commons.logging.simplelog.log.org.apache.http=ERROR

Также, если у вас нет уровня журнала, указанного для org.apache.http в файле свойств log4j, он наследует уровень log4j.rootLogger. Поэтому, если у вас есть log4j.rootLogger, чтобы разрешить говорить ERROR и вывести настройки org.apache.http в ваши log4j.properties, которые должны сделать только сообщения журнала ERROR только по наследованию.

UPDATE:

Создайте файл commons-logging.properties и добавьте в него следующую строку. Также убедитесь, что этот файл находится в вашем CLASSPATH.

org.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.Log4jFactory

Добавлен завершенный файл log4j и код для его вызова для OP. Этот log4j.properties должен находиться в вашем CLASSPATH. Я принимаю stdout на данный момент.

log4j.configuration=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

log4j.logger.org.apache.http=ERROR

Вот код, который нужно добавить в класс для вызова регистратора.

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 

public class MyClazz
{
    private Log log = LogFactory.getLog(MyClazz.class);
    //your code for the class
}

Ответ 10

Простой способ 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();

Ответ 11

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

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

Ответ 12

У меня была такая же проблема с JWebUnit. Обратите внимание, что если вы используете двоичное распределение, то Logback является регистратором по умолчанию. Чтобы использовать log4j с JWebUnit, я выполнил следующие шаги:

  • удалены банки журнала ошибок
  • добавить библиотеку моста lod4j для sfl4j - slf4j-log4j12-1.6.4.jar
  • добавить log4j.properties

Вероятно, вам не нужно удалять банки журнала, но вам понадобится дополнительный шаг, чтобы заставить slf4j использовать log4j

Ответ 13

Следующие две строки полностью решили мою проблему:

Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR);
Logger.getLogger("httpclient").setLevel(Level.ERROR);

Ответ 14

Я попал на этот пост при поиске решения аналогичной проблемы. Ответ Тима был очень полезен. как Мэтт Бейкер, я просто хочу отключить журнал httpClient без слишком большой конфигурации. Поскольку мы не были уверены, что была реализована реализация протоколирования под общим протоколированием, Мое решение состояло в том, чтобы заставить его использовать log4j, выбросив файл log4j jar в путь класса. Значение по умолчанию для конфигурации log4j отключает вывод отладки common-httpclient. Конечно, чтобы сделать его более надежным, вы можете создавать файлы common-logging.properties и log4j.properties для дальнейшего определения ваших конфигураций ведения журнала.

Ответ 15

Попробуйте добавить

org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog

в вашем Commons -logging.properties

Ответ 16

Добавьте приведенные ниже строки в файле свойств log4j и закройте http-журналы: - log4j.logger.org.apache.http = OFF

Ответ 17

Для apache 4.5.3, если вы хотите переместить уровень для всех HTTP-журналов apache в Warn, используйте:

log4j.logger.org.apache=WARN

Ответ 18

У меня была такая же проблема при запуске тестов интеграции jwebunit. Я исправил его, исключив logback и добавив в slf4j-log4j12, например:

<dependency>
  <groupId>net.sourceforge.jwebunit</groupId>
  <artifactId>jwebunit-htmlunit-plugin</artifactId>
  <version>3.0</version>
  <exclusions>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
</dependency>

Ответ 19

Мне потребовалось много времени, чтобы разобраться, нужно это:

log4j.logger.httpclient.wire=ERROR

Я предполагаю, что HttpClient использует "httpclient.wire" в качестве имени журнала, а не "org.apache.commons.httpclient".

Подлый подлец.

Ответ 20

У меня тоже была такая же проблема. При запуске тестов вся консоль была заполнена [main] DEBUG org.apache.http.wire.

Решением, которое мне помогло, было создание logback-test.xml src/test/resources/logback-test.xml, как в https://github.com/bonigarcia/webdrivermanager-examples/blob/master/src/test/resources/logback-test.xml (ссылка - https://github.com/bonigarcia/webdrivermanager/issues/203)

Чтобы просмотреть мою информацию о журнале, я заменил logger name = "io.github.bonigarcia" на имя моего пакета

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.mypackage" level="DEBUG" />
    <logger name="org" level="INFO" />
    <logger name="com" level="INFO" />

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

Ответ 21

Лучшим решением, которое я нашел, было использование плагина maven для принудительного использования, чтобы предотвратить использование общедоступных записей. Затем я добавил зависимость slf4j для ведения журнала. Поэтому добавьте следующее в свой pom.xml

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>[your version here]</version>
    </dependency>

а также добавить плагин maven-enforcer

<plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
           <version>[your version here]</version>
           <executions>
               <execution>
                   <id>enforce</id>
                   <configuration>
                       <rules>
                           <DependencyConvergence />
                           <bannedDependencies>
                               <excludes>
                                   <exclude>commons-logging:commons-logging</exclude>
                               </excludes>
                           </bannedDependencies>
                       </rules>
                   </configuration>
                   <goals>
                       <goal>enforce</goal>
                   </goals>
               </execution>
           </executions>
       </plugin>

Ответ 22

У меня возникла такая проблема после установки HttpComponentsClientHttpRequestFactory для моего шаблона отдыха.

Настройка OkHttpClientHttpRequestFactory должна решить проблему с протоколированием мусора.

Ответ 23

Просто добавьте эти две зависимости в файл pom: я попробовал и преуспел после попытки обсуждения ранее.

<!--Using logback-->
<dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.2</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

Commons-Logging → Logback и информация по умолчанию, пока отладки не будет; Ты можешь использовать:

private static Logger log = LoggerFactory.getLogger(HuaweiAPI.class);

чтобы определить информацию, которую вы хотите регистрировать: как Окончательный результат, как это. Только информация, которую я хочу войти, будет присутствовать.

Ответ 24

Я испробовал все вышеперечисленные решения безрезультатно. Самым близким вариантом для меня был тот, который предлагал создать logback.xml. Это сработало, однако ничего не было зарегистрировано. После игры с logback.xml, это то, что я закончил

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <withJansi>true</withJansi>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

Теперь все уровни ниже DEBUG регистрируются правильно.

Ответ 25

С:

  • Log2J 2 2.11.2
  • HttpClient 4.5.7 (остальные клиенты эластичного поиска 7.0.0)
  • Использование файла свойств для настройки

Можно добавить:

logger.httpclient.name=org.apache.http
logger.httpclient.level=info

В приведенном выше примере "httpclient" - логическое имя, которое вы выбираете.

(Проверено на приложении Java 11 OpenFX.)

Ответ 26

В моем случае я использую конфигурацию xml и добавляю это в файл конфигурации

<logger name="org.apache.http">
    <level value="warn"/>
</logger>

Ответ 27

Попробуйте 'log4j.logger.org.apache.http.headers = ОШИБКА'