【发布时间】: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.logging,Handlers 也有您需要配置的级别。此外,根据您获取logger实例的方式,它可能没有处理程序,实际上您看到的输出来自其祖先之一(假设useParentHandlers未设置为false)。
标签: java logging java.util.logging