我想覆盖特定软件包的日志记录级别。
该级别在限制级别较高时有效,但在级别限制较小时无效。
这里是一个例子:
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个日志(正常,信息和严重)。
我的错误在哪里?
谢谢。
答案 0 :(得分:0)
您的错误是没有意识到包过滤器和处理程序过滤器是独立应用的,即如果它们是AND的。
ConsoleHandler.level
过滤器的目的是减少控制台输出,同时允许例如一个记录所有内容的文件处理程序。主要用于同时登录控制台和文件时使用。
因此,处理程序级别不能被覆盖。
控制台输出通常比文件输出更多地被过滤的原因是,控制台输出在性能方面相对昂贵。您不希望将大量输出输出到控制台,因此通常会过滤掉更细粒度的日志消息。