【问题标题】:Simplest possible setting Java logging level, and it still fails. But, System.out.println still works最简单的设置 Java 日志级别,但仍然失败。但是, System.out.println 仍然有效
【发布时间】:2020-09-30 01:01:56
【问题描述】:

我无法在我的构造函数中一些打印日志。与其他人一样,日志记录的工作方式与我预期的一样。

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

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

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

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

注意:已根据@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"));
   }
}

【问题讨论】:

  • System.out.printing 与Logger 无关。我也猜测这也与子类化无关 - 基本上(作为发布的代码)与Log 无关,我建议您使用main 制作一个非常简单的类,以便打印。
  • 添加 System.out.print 的唯一目的是向自己证明代码实际上已经到达了代码中的那个点,然后忽略了日志记录语句。正如@jmehrens 所建议的那样,添加 ConsoleHandler 确实成功了!

标签: java logging java.util.logging


【解决方案1】:

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

.level 指定 Handler 的默认级别(默认为 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 添加到记录器,因为每个处理程序添加都会导致重复的控制台输出。

【讨论】:

  • 谢谢!除了一个拼写错误之外,效果很好! addHandler() 与 addHander()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多