Невозможно отключить протоколы 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>