我想在我的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级别?
答案 0 :(得分:1)
我曾试图做同样的事情,但是在一个网络启动应用程序中。我需要将java.util.logging设置为FINEST才能在应用程序中找到一些问题。我做的事情并不重要,Swing伐木只是一直喷涌而出。
你的问题,以及你所做过的调查帮助我解决了这个问题,虽然这是一个非常丑陋的方式,但我只是暂时需要它。我使用反射抓取了系统记录器:
picturebox
代码很脆弱,可能无法在所有java版本中使用。