gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:37:57 25 4
gpt4 key购买 nike

我有一个应用程序,我希望将其日志记录级别设置为 INFO,除非设置了 Debug模式,在这种情况下,我希望将级别设置为 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 方法的损坏行为。

关于java - 是否可以以编程方式覆盖 java.util.logging 属性文件中设置的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com