如何阻止Java库打印到控制台?

时间:2010-03-08 17:54:50

标签: java console

我正在使用一个库,当我引用它时,它会向控制台输出一堆多余的信息。有没有办法让库的输出静音?

7 个答案:

答案 0 :(得分:15)

如果它使用日志框架(log4j,commons-logging等),则可以编辑/创建属性文件以指示高日志记录阈值。在log4j中,这看起来像:

log4j.logger.org.library=error

如果库正在使用System.out,那么首先它不是一个好的库。您可以通过调用PrintStream(和System.setOut(yourDummyPrintStream))来更改System.setErr(..)。您的虚拟打印流只会吞下数据而不会在任何地方打印。

答案 1 :(得分:7)

您是否尝试使用System.setOut()System.setErr()设置OUT和ERR频道?

答案 2 :(得分:5)

我投了Jan的答案并希望补充:

使用setOut意味着您无法再在程序中打印到system.out。

你可以做到

PrintStream oldOut=System.out

首先保存它,然后调用setOut更改它 - 然后只需打印到oldOut。

我已经把它用作迷你记录器 - 抓住System.out,用我自己的流替换它并让我自己的流抓取堆栈跟踪并找出调用方法以便它可以在转发到原始System.out之前添加方法名称。

非常慢,但适合调试。有一个设置,所以你可以恢复只是打印字符串,隐藏所有输出或过滤消息来自哪个方法(这是我的主要用法,隐藏所有其他垃圾,所以我可以看到我自己的输出)。

答案 3 :(得分:2)

考虑使用AspectJ,它可以用您选择的语句替换所有出现的System.out.println(),这可能是一个日志语句。这也适用于第三方jar文件(寻找加载时编织)。

答案 4 :(得分:0)

我认为任何体面/理智的库都不会使用System.out来记录消息。所以我可以放心地假设它使用某种日志框架。将特定包配置为更高的日志记录级别,如“ERROR”或“FATAL”,以便您不会看到这些消息。

答案 5 :(得分:0)

库可能使用logger,log4j或slf4j。您可以为该记录器创建配置文件,然后将日志级别设置为WARN或更高。这将停止打印信息。

答案 6 :(得分:0)

如果lib使用打印,我会使用asm来替换所有sys.out.printXXx,并调用另一个具有吞咽等类似方法签名的类。