最简单的可能设置 Java 日志记录级别,它仍然失败。但是,System.out.println 仍然有效

Simplest possible setting Java logging level, and it still fails. But, System.out.println still works

我在 一些 的构造函数中无法打印日志。对于其他人,日志记录工作正常。

我试图通过使用默认值并在 class 本身内明确设置日志级别来消除所有可能的混淆来源。我尝试将记录器实例化为静态变量和实例变量。

但是,即使将日志记录级别设置为“Level.ALL”在某些 classes 中似乎也不起作用。

对于实例记录器,我一直在 instance-initializer / anonymous block。对于静态实例,我使用静态块来设置日志记录级别。

知道为什么日志消息没有在下面的 class 中打印出来吗?

注意:根据@jmehrens

的评论,代码已被编辑以显示修复
public abstract class ReadFileInformation extends SimpleFileVisitor<Path> {
   static public ConsoleHandler globalConsoleHandler = new ConsoleHandler(); // fix, based on comment by @jmehrens
   static private final Logger logger = Logger.getLogger(ReadFileInformation.class.getName());
   static { // fix: See comment by @jmehrens
      globalConsoleHandler.setLevel(Level.ALL);
      logger.addHandler(globalConsoleHandler);
   }
   {
      logger.setLevel(Level.ALL);
      logger.log(Level.FINEST, String.format("This does NOT print.\n"));
      System.out.println("In ReadFileInformation Static Block.  This prints out!");
   }
}
public class ReadMetadateFileInformation extends ReadFileInformation {
   static private final Logger logger = Logger.getLogger(ReadMetadateFileInformation.class.getName());
   static {
      logger.setLevel(Level.ALL);
      logger.log(Level.FINEST, String.format("This does NOT print.\n"));
      System.out.println("In ReadMetadateFileInformation Static Block.  This prints out!");
   }
   {
      logger.log(Level.FINEST, String.format("This does NOT print.\n"));
      System.out.println("In ReadMetadateFileInformation Anonymous Block.  This prints out!");
   }
   public ReadMetadateFileInformation() {
      super();
      logger.log(Level.FINE, String.format("This does NOT print.\n"));
   }
}

根据 java.util.logging.ConsoleHandler 文档:

.level specifies the default level for the Handler (defaults to Level.INFO).

您正在调整记录器以将级别设置为 ALL,这将生成您想要查看的日志记录。但是,ConsoleHandler 将过滤它们,因为 ConsoleHandler 的默认级别是 INFO。因此,您也必须调整 ConsoleHandler 的级别。您需要执行以下操作之一:

  1. 添加一个 ConsoleHandler 并将级别设置为 ALL。
  2. 修改根ConsoleHandler,将级别设置为ALL。

由于您是通过代码修改记录器配置,因此执行 #1 可能更容易。

ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.ALL);
logger.addHandler(ch);
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));

您还必须确保不要将 ConsoleHandler 多次添加到记录器,因为每次添加处理程序都会导致重复的控制台输出。