是否可以以编程方式覆盖 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
方法的错误行为。
我有一个应用程序,我想将其日志记录级别设置为 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
方法的错误行为。