无法关闭HtmlUnit日志消息

16

我正在使用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的解决方案可用?


1
可能是关闭HtmlUnit警告的重复问题。 - Mosty Mostacho
7个回答

15
我也遇到了这个问题。答案取决于commons-logging在底层使用的日志记录系统(因为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安装位置中的lib/logging.properties。
在我的情况下,我在类路径中有Log4j,所以它默认使用了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

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

对我来说,在众多测试中,只有这些能够清除控制台......简直是一片宁静。 - Alain BUFERNE

8
尝试将以下代码放入您的程序中:

LogManager.getLogManager().reset();

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

最后一行代码将关闭由于目标站点接受或拒绝Cookies而发生的大部分日志记录。

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

1

尝试编写自己的log4j配置文件,并使用Java选项使htmlunit使用它:

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

然后在你的log4j.properties文件中:

log4j.logger.com.gargoylesoftware.htmlunit=error

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接