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

如何阻止Java库打印到控制台?,java,console,Java,Console,我使用的库在引用控制台时会将一堆多余的信息打印到控制台。有没有办法使库的输出静音?我不认为任何正常的库使用System.out来记录消息。所以我可以安全地假设它使用某种日志框架。将特定包配置为更高的日志记录级别,如“错误”或“致命”,以便您不会看到这些消息。库可能使用logger、log4j或slf4j。您可以为该记录器创建一个配置文件,然后将日志级别设置为WARN或更高。这将停止打印信息。您是否尝试过使用System.setOut()和System.setErr()?如果它使用日志框架(log

我使用的库在引用控制台时会将一堆多余的信息打印到控制台。有没有办法使库的输出静音?

我不认为任何正常的库使用System.out来记录消息。所以我可以安全地假设它使用某种日志框架。将特定包配置为更高的日志记录级别,如“错误”或“致命”,以便您不会看到这些消息。

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

您是否尝试过使用
System.setOut()
System.setErr()

如果它使用日志框架(log4j、commons logging等),您可以编辑/创建一个属性文件来指示高日志树名。在log4j中,这看起来像:

log4j.logger.org.library=error

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

我对Jan的答案投了赞成票,并想添加:

使用“设置”意味着您无法再在程序中打印到system.out

你能行

PrintStream oldOut=System.out
首先保存它,然后调用setOut来更改它——然后只打印到oldOut

我甚至把它用作了一个微型记录器——获取System.out,用我自己的流替换它,让我自己的流获取堆栈跟踪并找出调用方法,这样它就可以在转发到原始System.out之前添加方法名


速度非常慢,但有利于调试。有一个设置,您可以恢复到只打印字符串、隐藏所有输出或筛选消息来源的方法(这是我的主要用途,隐藏所有其他垃圾以便我可以查看自己的输出)。

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

如果lib使用prints,我将使用asm替换所有sys.out.printXXx,并调用另一个类,该类具有类似的方法signatutes,如swallow等