Невозможно отключить протоколы HtmlUnit
Я использую HtmlUnit для взаимодействия с веб-страницей, которая взаимодействует с сервером через Ajax. Вскоре после запуска Ajax-кода HtmlUnit выдает два сообщения журнала:
WARNING: Ignoring XMLHttpRequest.setRequestHeader for Content-length: it is a restricted header
Mar 3, 2011 3:32:47 PM com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest jsxFunction_setRequestHeader
WARNING: Ignoring XMLHttpRequest.setRequestHeader for Connection: it is a restricted header
Mar 3, 2011 3:32:47 PM com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest jsxGet_status
... Следующее это сообщение повторяется шесть раз:
SEVERE: XMLHttpRequest.status was retrieved before the response was available.
Mar 3, 2011 3:32:47 PM com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest jsxGet_status
Я не могу понять, как отключить эти сообщения. Прохождение через код показывает, что они создаются прямыми вызовами в журнале, а не через объект-обработчик, для которого я мог бы обеспечить реализацию do-nothing, как я уже делал для ошибок CSS. Страница HtmlUnit logging указывает, что добавление этого кода должно работать:
System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "fatal");
... но это не имеет никакого эффекта. Я также попытался добавить следующий параметр, в котором я вызываю java:
-Dorg.apache.commons.logging.simplelog.defaultlog=fatal
... но это также не имеет эффекта.
Я предполагаю, что я мог бы перенаправить stderr в /dev/null, пока этот код выполняется, но доступны ли какие-либо менее хакерские решения?
Ответы
Ответ 1
У меня тоже были проблемы с этим.
Ответ зависит от того, какая система ведения журнала используется для каротажа. (поскольку общий журнал - это просто оболочка). См. Следующие
http://commons.apache.org/proper/commons-logging/guide.html#Configuring_The_Underlying_Logging_System
Атрибут, упомянутый выше (org.apache.commons.logging.simplelog.defaultlog), должен быть действительным только в том случае, если используется простой регистратор. Если вы работаете на JDK 1.4 или выше, однако он должен использовать протокол JDK по умолчанию. В этом случае он по умолчанию использует lib/logging.properties из места установки JRE.
В моем случае у меня был Log4j в пути к классам, поэтому он был по умолчанию.
Чтобы убрать случайность всего этого, вы можете явно установить Logger самостоятельно. Создайте файл commons-logging.properties в пути к классам и пройдите в регистраторе, чтобы использовать, например.
# JDK Logging
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
# Log4j logging (also required log4j.jar to be in classpath)
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
Для log4j добавление следующих параметров log4j.properties останавливает предупреждения из HtmlUnit.
log4j.logger.com.gargoylesoftware.htmlunit=ERROR
Ответ 2
Вы также можете использовать:
org.apache.log4j.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(org.apache.log4j.Level.FATAL);
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.SEVERE);
Ответ 3
Попробуйте поместить это в свой код:
LogManager.getLogManager().reset();
Ответ 4
Добавьте это в свой код:
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http.client.protocol.ResponseProcessCookies").setLevel(Level.OFF);
Последняя строка отключит большинство журналов, которые происходят из-за того, что файлы cookie принимаются или отклоняются на целевом сайте.
Ответ 5
Я использую Htmlunit 2.13, и следующий код работает для trunoff предупреждений.
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
Ответ 6
Попробуйте написать свой собственный файл конфигурации log4j и при помощи htmlunit использовать его с опцией java:
-Dlog4j.configuration=file:///my/conf/log4j.properties
Затем в вашем файле log4j.properties:
log4j.logger.com.gargoylesoftware.htmlunit=error
Ответ 7
Если используется Spring, Spring по умолчанию использует LogBack, поэтому вы можете создать logback.xml или logback-test.xml в папке "main/resources/" или "test/resources".
Вы можете установить уровень регистрации для каждого пакета следующим образом:
<configuration>
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="error">
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.mypackage" level="debug"/>
<logger name="com.gargoylesoftware" level="error"/>
</configuration>