无法关闭HtmlUnit日志记录消息

时间:2011-03-03 23:53:00

标签: logging 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

我无法弄清楚如何关闭这些消息。浏览代码表明它们是通过直接调用记录器产生的,而不是通过我可以提供无操作实现的处理程序对象产生的,正如我已经为CSS错误所做的那样。 HtmlUnit logging page表示添加此代码应该有效:

System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "fatal");

......但它没有效果。我还尝试在调用java时添加以下选项:

-Dorg.apache.commons.logging.simplelog.defaultlog=fatal

......但这也没有效果。

我想我可以在执行此代码时将stderr重定向到/ dev / null,但是可用的hacky解决方案是否可用?

7 个答案:

答案 0 :(得分:13)

我也有这个问题.. 答案取决于日志记录系统公共日志记录在引擎盖下使用的内容。 (因为common-logging只是一个包装器)。请参阅以下内容 http://commons.apache.org/proper/commons-logging/guide.html#Configuring_The_Underlying_Logging_System

上面提到的属性(org.apache.commons.logging.simplelog.defaultlog)只有在使用简单记录器时才有效。如果您在JDK 1.4或更高版本上运行,则它应该默认使用JDK日志记录。在这种情况下,它默认使用JRE安装位置的l​​ib / logging.properties。

在我的情况下,我在类路径中有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

答案 1 :(得分:11)

您也可以使用:

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

答案 2 :(得分:9)

尝试将其放入您的代码中:

LogManager.getLogManager().reset();

答案 3 :(得分:3)

将其添加到您的代码中:

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在目标站点被接受或拒绝而发生的大多数日志。

答案 4 :(得分:2)

我正在使用Htmlunit 2.13,以下代码正在努力解决警告。

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

答案 5 :(得分:1)

尝试编写自己的log4j配置文件,并使htmlunit将其与java选项一起使用:

-Dlog4j.configuration=file:///my/conf/log4j.properties

然后在你的log4j.properties中:

log4j.logger.com.gargoylesoftware.htmlunit=error

答案 6 :(得分:0)

如果使用Spring,Spring默认使用LogBack,因此您可以在“ main / resources /”或“ test / resources”文件夹中创建logback.xml或logback-test.xml。

您可以像这样通过软件包设置日志级别:

<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>