如何在Java中禁用运行时警告?

4

我正在使用一个jar文件在java程序中,但是它在运行时生成警告。但是我不希望我的客户看到这些警告。

如何禁用这些警告。

以下是警告信息:

Sep 25, 2009 10:10:33 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Expected content type of 'application/javascript' or 'application/ecmascript' for remotely loaded JavaScript element at 'http://www.craigslist.org/js/jquery.js', but got 'application/x-javascript'.

你的客户为什么会首先看到控制台? - Vineet Reynolds
8
你需要修复你的错误。 - Ed S.
6个回答

7
从消息的外观来看,您正在使用 HtmlUnit which uses Commons Logging 记录日志消息。除非您将 Commons Logging 配置为写入文件,否则日志消息将由 Commons Logging 的 简单记录器 记录,该记录器会写入控制台。
如果您想让错误消息消失,可以采用以下任一选项:
  1. 将 Commons Logging 配置为将日志写入磁盘上的文件(使用 log4j)。
  2. 将控制台输出重定向到 /dev/null 或其等效项,正如 sal 所指出的那样。

所以我想使用您的选项2,即将控制台输出重定向到/dev/null。 您能告诉我如何重定向它们吗? - Amit
你需要学习如何配置Commons Logging。请查看Vineet提供的链接。 - matt b
您可能想阅读 http://en.wikipedia.org/wiki/Redirection_%28computing%29 - Vineet Reynolds
1
查看Commons Logging文档,我发现了这样一句话:“SimpleLog将所有(已启用的)日志消息发送到System.err,对于所有定义的记录器。”在缺乏真正的错误管理时,这将创建一个控制台窗口并显示错误。您可能希望执行更正确的操作,例如实现和配置真正的日志记录,即使它不处理消息。 - DaveE
我同意。我们引导他们去喝水,但他们必须自己喝。我的想法是提到System.Err和描述正在发生的事情应该足够让一个相当半能力的程序员有一个“啊哈!”的时刻。我的18岁的儿子能够从问题描述中解决这个问题,他只上过一门编程课并做了少量的黑客攻击。 - DaveE
显示剩余2条评论

3
一种更简单的方法,无需将Log4j添加为依赖项,只需简单地重定向STDERR。
System.setErr(new PrintStream("/dev/null"));

这就是你真正需要的。

注意:确保在使用HtmlUnit完成后重置流。

final PrintStream err = new PrintStream(System.err);
System.setErr(new PrintStream("/dev/null"));

// ...

System.setErr(err);

1

假设这些是日志消息,您可以配置记录器将所有内容写入 null 或 /dev/null

在路径中放置此类文件可能会有所帮助

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="NULL" class="org.apache.log4j.FileAppender">
        <param name="File" value="/dev/null"/>
    </appender>

   <logger name="com.gargoylesoftware.htmlunit">
       <level value="FATAL"/>
       <appender-ref ref="NULL"/>
   </logger>

</log4j:configuration>

你能详细解释一下吗?我没有使用任何记录器。 - Amit
2
那么你正在使用的库必须是。 - Michael Myers
1
最好将记录器的级别更改为仅记录错误级别 - 将日志更改为写入/dev/null意味着您可能会丢失任何实际的错误报告,这些报告在以后进行调试时可能会需要。 - Nate
你正在使用的库,使用java.util.logging.*来输出信息。 - Thorbjørn Ravn Andersen
请问您如何将所有内容写入 null 或 /dev/null? - Amit
@Yatendra - 是的,你正在使用一个日志记录器。虽然没有明确指出,但你的代码确实在使用一个(HtmlUnit会记录错误)。请阅读文档,其中明确说明:“如果您没有显式配置commons logging……那么它将使用简单的日志记录器。”你需要将简单的日志记录器指向/dev/null或等效位置。请阅读文档以了解如何操作。 - DaveE

1

只需从Vineet发布的链接中复制第一行:

如果您没有明确配置commons logging使用LOG4J或其他日志框架,则它将使用简单记录器。当使用简单记录器时,您可以通过设置以下系统属性来更改默认日志记录级别:

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

在程序的开头添加这段代码。

我的错误:log4j未与HtmlUnit捆绑在一起。请参见我的“答案”。 - Roboprog

1
由于OP一直在问如何重定向到/dev/null: 您可以通过调用System.setOut和System.setErr来实现类似的效果,传入一个不对其给出的输出执行任何操作的PrintStream。
这是一个可怕的hack,之前的答案要干净得多。

0

我发现HtmlUnit并没有包含log4j的实现,只有commons logging的“接口”(以及抽象类)。

一旦将log4j.jar放在路径上,HtmlUnit的行为就会更好,并遵守其配置。


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