如何在不召唤无限的平台调试日志记录的情况下使用日志级别FINE?

时间:2014-03-10 22:00:12

标签: java applet java.util.logging

我想在我的applet中使用java util logging,日志级别为FINE及以下。

我在applet的jar中放了一个logging.properties文件,上面写着

handlers= java.util.logging.ConsoleHandler
.level= FINE
java.util.logging.ConsoleHandler.level = FINE

在我的applet类中,我使用

将其提供给日志管理器
logManager.readConfiguration(getClass().getResourceAsStream("logging.properties"));

这成功地使我的调试日志记录显示在applet的控制台窗口中,但正如我所料,java平台也开始将其FINE级别消息记录到控制台。

更糟糕的是,将消息记录到Java控制台本身会导致更多的AWT日志记录(!)这会在我的控制台中生成无限循环的消息

20:31:55 java.awt.mixing.Component FINE: this = javax.swing.JTextArea[...]
20:31:55 java.awt.mixing.Container FINE: this = javax.swing.JViewport[...]

我认为通过添加

可以很容易地解决这个问题
java.level=INFO
javax.level=INFO
sun.level=INFO

到我的logging.properties文件。

然而,这不起作用。无论我在属性文件中写什么,平台日志记录都会一直喷出。

我已经深入了解了源代码。 LogManager似乎保留了两个不同的LoggingContexts。一个用户,一个系统上下文。我的logging.properties文件只影响用户LoggingContext中的Loggers,因此不会影响平台日志记录的设置。

LogManager确实在用户LoggingContext和系统LoggingContext之间共享rootLogger。当我将其水平设置为FINE时,我会获得无限的awt blurb流作为副作用。

所以我的问题是:如何让我的用户上下文的记录器默认登录到FINE级别,但是将系统记录器保持在INFO级别?

1 个答案:

答案 0 :(得分:1)

我曾试图做同样的事情,但是在一个网络启动应用程序中。我需要将java.util.logging设置为FINEST才能在应用程序中找到一些问题。我做的事情并不重要,Swing伐木只是一直喷涌而出。

你的问题,以及你所做过的调查帮助我解决了这个问题,虽然这是一个非常丑陋的方式,但我只是暂时需要它。我使用反射抓取了系统记录器:

picturebox

代码很脆弱,可能无法在所有java版本中使用。