Отключить ведение журнала 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 = ОШИБКА'