是否可以以编程方式覆盖 java.util.logging 的属性文件中设置的值?

Is it possible to override values set in properties file for java.util.logging programatically?

我有一个应用程序,我想将其日志记录级别设置为 INFO,除非设置了调试模式,在这种情况下我想将级别设置为 FINEST

如果我在属性文件中设置级别,它也不会被使用 logger.setLevel(Level.FINEST) 的程序覆盖,如果我没有为属性文件中的 .level 字段设置任何内容,通过默认采用 INFO 级别,如果 isDebugEnable().

我无法重写以使用 FINEST

如何根据条件配置此级别?

 try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) {
        LogManager.getLogManager().readConfiguration(configFile);
    } catch (IOException e) {
        throw new IllegalStateException("Unable to load default logging properties.", e);
    }
 if (isDebugEnabled()) {
        logger.setLevel(Level.FINEST);
    } else {
        logger.setLevel(Level.INFO);
    }

我的配置文件如下:

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

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Enable console to set level to FINEST and above.
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

我可以按照下面的方法来做这个,但想知道是否有更好的方法来做到这一点。 (可能正在使用属性文件)

ConsoleHandler consoleHandler = new ConsoleHandler();
setLogLevel();
consoleHandler.setLevel(Level.FINEST);
logger.addHandler(new ConsoleHandler()); 

如果您在启动 JVM 之前设置 DEBUG 选项,那么只需打包一个名为 debug.properties 的第二个 logging.properties 文件并将 java.util.logging.config.file 更改为指向debug.properties 当您需要调试选项时。

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

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Enable console to set level to show all levels.
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

如果您必须在 运行 时设置级别,您将 运行 遇到 readConfiguration not resetting all everything after boot of the JVM 的问题。在 JDK 8 或更早版本下,您所能做的就是调用 readConfiguration 来填充默认值并添加更多代码来修复损坏的行为。由于您只需要在处理程序上设置级别,然后只需添加该代码即可。

try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) {
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException e) {
    throw new IllegalStateException("Unable to load default logging properties.", e);
}

Level lvl;
if (isDebugEnabled()) {
    lvl = Level.FINEST;
} else {
    lvl = Level.INFO;
}
logger.setLevel(lvl);
for(Handler h : logger.getHandlers()) {
    h.setLevel(lvl);
}

JDK 9 提供了一个 updateConfiguration 方法,可以解决 readConfiguration 方法的错误行为。