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

时间:2017-08-31 06:14:07

标签: java properties-file java.util.logging

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

如果我在属性文件中设置了级别,它也不会使用logger.setLevel(Level.FINEST)从程序中覆盖,如果我没有为属性文件中的.level字段设置任何内容,默认情况下如果是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()); 

1 个答案:

答案 0 :(得分:2)

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

debug.properties

如果您必须在运行时设置级别,则会遇到readConfiguration not resetting all everything after boot of the JVM的问题。在JDK 8或更早版本中,您可以调用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

JDK 9提供了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); } 方法,可以解决updateConfiguration方法的破坏行为。