我想覆盖特定包的日志记录级别。
当级别限制较多时它起作用,但当级别限制较少时它不起作用。
这是一个例子:
public class Main {
private static final java.util.logging.Logger JDK_LOGGER = java.util.logging.Logger.getLogger(Main.class.getName());
public static void main(String[] args) {
JDK_LOGGER.fine("Hello fine (jdk)...");
JDK_LOGGER.info("Hello info (jdk)...");
JDK_LOGGER.severe("Hello severe (jdk)...");
如果指定的包具有更严格的限制级别,则它可以工作:
handlers = java.util.logging.ConsoleHandler
.level = FINE
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.ice.level = SEVERE
它打印:
août 19, 2019 10:44:25 PM com.ice.foo.Main main
GRAVE: Hello severe (jdk)...
但是如果指定的包具有较少的限制级别,则它不会按我的预期工作:
handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.ice.level = FINE
它打印:
août 19, 2019 10:55:50 PM com.ice.foo.Main main
INFOS: Hello info (jdk)...
août 19, 2019 10:55:50 PM com.ice.foo.Main main
GRAVE: Hello severe (jdk)...
但是,因为“FINE”>“INFO”>“SEVERE”,我希望看到 3 个日志(“fine”、“info”和“severe”)。
我的错误在哪里?
谢谢。
最佳答案
您的错误在于没有意识到包过滤器和处理程序过滤器是独立应用的,即就好像它们是 AND'd。
ConsoleHandler.level
过滤器的目的是减少控制台输出,同时允许例如一个记录所有内容的文件处理程序。主要用于同时登录控制台和文件时。
因此,处理程序级别无法被覆盖。
控制台输出通常比文件输出过滤得更多的原因是控制台输出在性能方面相对昂贵。您不希望控制台有大量输出,因此通常会过滤掉更细粒度的日志消息。
关于java - 如何覆盖/增加包的 Java 日志记录级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563882/