为什么在System.Logger中使用log(DEBUG,msg)代替debug(msg)?

时间:2018-11-14 13:04:13

标签: java logging java-9

我正在阅读Java 9中引入的System.Logger API。我不明白为什么他们开发了strange API:

System.Logger {
  public default void log(Level level, String msg){...}
}

之所以称为strange,是因为(我知道)所有流行的日志记录框架都没有将level作为参数,而是通过级别名称来命名调用方法。例如:

//Log4j
logger.error("This is error : " + parameter);
//SLF4J
logger.debug("Printing variable value: {}", variable);
//apache.commons.logging
log.debug(Object message);
//and even sun.util.logging.PlatformLogger
logger.warning(String msg)

如何解释?

1 个答案:

答案 0 :(得分:3)

除非您是开发人员,否则有关开发人员意图的问题天生就很难回答。

话虽如此,我们确实可以使用此功能的原始提案-JEP 264

摘要:

  

定义一个最小的日志记录API,平台类可用于记录消息,以及用于这些消息的使用者的服务接口。库或应用程序可以提供此服务的实现,以便将平台日志消息路由到其选择的日志记录框架。如果未提供实现,则使用基于java.util.logging API的默认实现。

从目标出发:

  

易于被使用外部日志记录框架的应用程序采用,例如SLF4J或Log4J。

非目标中:

  

定义用于日志记录的通用接口不是目标。服务接口仅包含JDK自己使用所需的最少方法集。

因此,这里所拥有的不是诸如SLF4J,Log4J等之类的“另外一个日志记录框架”。我们所拥有的是一个接口,该接口可让您告诉JVM使用与该类中使用的相同的日志记录工具。您的应用程序,用于记录自己的内容。

典型的使用场景是在SLF4J中具有复杂设置,登录到控制台,文件,数据库或向手机发送文本的应用程序。您希望JVM类使用同一系统。因此,您编写了一个适配器-使用SLF4J设置来实现System.Logger接口的类。

不是您不能使用当前的系统记录器进行记录-您可以-但这不是它创建的目的。它是为您实现和设置系统记录器而创建的,以便调用您选择的记录框架。

在当前形式下,实现时,您只需实现四个方法:

  • getName()
  • isLoggable(System.Logger.Level)
  • log(System.Logger.Level, ResourceBundle, String, Object...)
  • log​(System.Logger.Level, ResourceBundle, String, Throwable)

现在,System.Logger.Level有七个级别。想象一下,如果不必实施两种日志记录方法,而必须实施14种日志记录方法呢?而且通常情况下,这些实现看起来会完全相同,只需要一点点更改即可。这是不明智的。

就目前而言,几乎每个现有的日志记录框架都有一个log(level,...)方法,然后通常可以通过从{{1 }}添加到您框架的级别定义中。


如果您想记录一条消息?

好吧,如果您使用的是复杂的日志记录平台,则可以直接在其中记录您的消息,而无需通过系统记录器。如果您坚持要使用它,则需要将级别用作参数或编写自己的包装器。这根本不是开发人员想到的用例。

相关问题