如何覆盖/增加包的Java日志记录级别?

时间:2019-08-19 20:58:41

标签: java logging

我想覆盖特定软件包的日志记录级别。

该级别在限制级别较高时有效,但在级别限制较小时无效。

这里是一个例子:

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个日志(正常,信息和严重)。

我的错误在哪里?

谢谢。

1 个答案:

答案 0 :(得分:0)

您的错误是没有意识到包过滤器和处理程序过滤器是独立应用的,即如果它们是AND的。

ConsoleHandler.level过滤器的目的是减少控制台输出,同时允许例如一个记录所有内容的文件处理程序。主要用于同时登录控制台和文件时使用。

因此,处理程序级别不能被覆盖。

控制台输出通常比文件输出更多地被过滤的原因是,控制台输出在性能方面相对昂贵。您不希望将大量输出输出到控制台,因此通常会过滤掉更细粒度的日志消息。