【问题标题】:Why is Java Logging API not displaying FINE messages?为什么 Java Logging API 不显示 FINE 消息?
【发布时间】:2022-12-28 11:35:09
【问题描述】:

我想知道为什么 Java Logging API 没有显示更好、更好、最好的消息。

让我们看看下面的代码:

logger.setLevel(Level.ALL);
logger.info("Level:" + logger.getLevel());
logger.severe("Some Fatal message%n");
logger.warning("Some WARN message%n");
logger.info("Some INFO message%n");
logger.fine("Some DEBUG message%n");
logger.finer("Some DEBUG message%n");
logger.finest("Some TRACE message%n");

我希望这会显示每条日志消息,因为我在第一行中指定了 LogLevel.ALL。

但是它忽略了很好的消息,这是我所看到的:

22-08-28 16:37:25.997 信息 [全球] 级别:全部
22-08-28 16:37:26.025 严重 [全球] 一些致命消息
22-08-28 16:37:26.025 警告 [全局] 一些警告消息
22-08-28 16:37:26.026 信息 [全局] 一些信息消息

鉴于我已将级别设置为 ALL,为什么它会跳过 fine、finer 和 finest?

【问题讨论】:

  • 顺便说一句,那些 if 语句是无用的。检查这些方法的实现。他们已经给自己打电话了isLoggable。自己添加条件在 3 方面更糟:冗长、性能和对拼写错误的敏感性。
  • 谢谢。我不知道,删除。其他日志记录框架也是如此吗,例如 Log4J 1/2、Logback 和 SLF4J 等?
  • 是的。这个想法是记录器负责根据消息的级别和记录器的配置级别来决定是否应该记录消息。应用程序代码不应该关心那个。几乎唯一有意义的情况是手动检查记录器是否会在某个级别进行记录,即消息的计算成本是否很高,但大多数(如果不是全部)现代框架都提供了一个 API 来指定延迟计算的消息。
  • 所有这些框架都是如此,是的。当您可能想要包含条件时会有一些例外情况,例如 log.debug("foo {}", someExpensiveOperation()) 但这不是常态
  • 对于java.util.loggingHandlers 也有您需要配置的级别。此外,根据您获取 logger 实例的方式,它可能没有处理程序,实际上您看到的输出来自其祖先之一(假设 useParentHandlers 未设置为 false)。

标签: java logging java.util.logging


【解决方案1】:

您需要在Handlers 上额外设置级别。在您的情况下,处理程序是获取实际日志事件然后将它们推送到标准输出的东西。

logger.setLevel(Level.ALL);
for (Handler handler : logger.getParent().getHandlers()) {
    handler.setLevel(Level.ALL);
}

【讨论】:

  • 我的配置文件中有以下行。那不应该解决问题吗? java.util.logging.FileHandler.level=最好
  • @VictorGrazi 那么你在哪里寻找日志?你从来没有说过。如果你正在寻找安慰那就不要。将来请在原始问题中包含所有此类详细信息。
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多