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

标签 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 个日志(“fine”、“info”和“severe”)。

我的错误在哪里?

谢谢。

最佳答案

您的错误在于没有意识到包过滤器和处理程序过滤器是独立应用的,即就好像它们是 AND'd。

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

因此,处理程序级别无法被覆盖。

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

关于java - 如何覆盖/增加包的 Java 日志记录级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563882/

相关文章:

Java LWJGL 新窗口渲染问题

PHP 向传递给 mysql_query 的字符串添加乱码

java - java中根据大小添加字符串类型数组中的值

java - requestLocationUpdates 抛出错误

java - 过滤 Apache Spark Log4J 消息以仅保留包含特定字符串的消息

java - 将在常量池中创建多少个字符串对象

Windows 批处理文件将输出重定向到带有日期/时间的日志文件

Android studio 错误,通过添加 Log.d 修复?

Java 抽象类 : Returning “this” pointer for derived classes "follow up"

一个应用程序中的 java.util.logging.Logger 和 org.apache.log4j.Logger - 第一个会记录为 log4j 吗?