JDK:如何以编程方式启用PlatformLogger

我需要以编程方式为某些JDK7内部类启用日志记录。

这是我在我的应用程序初始化中所做的事情:

httpLogger = Logger.getLogger("sun.net.www.protocol.http.HttpURLConnection"); httpLogger.setLevel(Level.FINEST); 

其中httpLogger是一个强引用(为了避免记录器被垃圾收集)。 我还将ConsoleHandler的级别设置为ALL。 但是我无法获得任何输出。

如果我通过记录配置文件来执行它,它按预期工作。

我可能错了,但我认为这与我有所关系,不了解在Java 7中引入的PlatformLogger以及 – afaik – 现在用于所有JDK内部日志记录。 或许我只是不太了解JUL。

我猜它会起作用,如果我这样做:

 httpLogger = PlatformLogger.getLogger("sun.net.www.protocol.http.HttpURLConnection"); httpLogger.setLevel(Level.FINEST); 

但是PlatformLogger类在我无法引用的包中。

什么是PlatformLogger

这是JavaDoc:

 Platform logger provides an API for the JRE components to log messages. This enables the runtime components to eliminate the static dependency of the logging facility and also defers the java.util.logging initialization until it is enabled. In addition, the PlatformLogger API can be used if the logging module does not exist. If the logging facility is not enabled, the platform loggers will output log messages per the default logging configuration (see below). In this implementation, it does not log the the stack frame information issuing the log message. When the logging facility is enabled (at startup or runtime), the java.util.logging.Logger will be created for each platform logger and all log messages will be forwarded to the Logger to handle. Logging facility is "enabled" when one of the following conditions is met: 1) a system property "java.util.logging.config.class" or "java.util.logging.config.file" is set 2) java.util.logging.LogManager or java.util.logging.Logger is referenced that will trigger the logging initialization. Default logging configuration: global logging level = INFO handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter Limitation: /lib/logging.properties is the system-wide logging configuration defined in the specification and read in the default case to configure any java.util.logging.Logger instances. Platform loggers will not detect if /lib/logging.properties is modified. In other words, unless the java.util.logging API is used at runtime or the logging system properties is set, the platform loggers will use the default setting described above. The platform loggers are designed for JDK developers use and this limitation can be workaround with setting -Djava.util.logging.config.file system property. @since 1.7 

我的解决方案出现在一个小的自定义小部件演示程序的开头:

 // Log all focus messages. final Logger rootLogger = Logger.getLogger(""); rootLogger.setLevel(Level.ALL); final ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.ALL); // Because there are a lot of focus messages, make them // a little easier to read by logging only the message. consoleHandler.setFormatter(new Formatter() { @Override public String format(LogRecord record) { return "FOCUS: " + record.getMessage() + '\n'; } }); final Logger logger = Logger.getLogger("java.awt.focus.Component"); logger.setLevel(Level.ALL); logger.setUseParentHandlers(false); logger.addHandler(consoleHandler); 

我不清楚为什么我需要将rootLogger级别设置为ALL,但这就是我所需要的。

你必须先阅读它的内容。

  the PlatformLogger API can be used if the logging module does not exist 

那么如果您想使用该API,请使用以下import语句。

 import sun.util.logging.PlatformLogger; 

以上是您目的地的完整参考。

有关进一步参考,请访问Java的BUG跟踪