代码之家  ›  专栏  ›  技术社区  ›  Pavel_K

为什么在System.Logger中使用log(DEBUG,msg)而不是DEBUG(msg)?

  •  2
  • Pavel_K  · 技术社区  · 6 年前

    我正在阅读Java9中引入的System.Logger API,我不明白他们为什么要开发这么多 strange 应用程序编程接口:

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

    我称之为 奇怪的 因为所有流行的日志框架(我知道)都不把level作为参数,而是用level name来命名调用方法。例如:

    //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 回复  |  直到 6 年前
        1
  •  4
  •   RealSkeptic    6 年前

    关于开发者意图的问题本来就很难回答,除非你是开发者。

    也就是说,我们确实可以访问此功能的原始方案- JEP 264 .

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

    从目标来看:

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

    从非目标:

    因此,我们这里没有“另一个日志框架”,如SLF4J、Log4J等。我们有一个接口,允许您告诉JVM使用与您在应用程序中的类相同的日志工具,来记录它自己的内容。

    典型的使用场景是一个应用程序,它有一个复杂的设置,比如SLF4J,登录到控制台,文件,数据库,或者向手机发送文本。您希望JVM类使用相同的系统。所以您编写了一个适配器—一个实现 System.Logger 界面,使用SLF4J设置。

    在其当前形式中,实现时只需要实现四种方法:

    • 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,...) 方法,然后实现 log(...) 通常可以通过从 你的框架对级别的定义。


    如果你想记录一条消息?

    好吧,如果你使用的是一个复杂的日志平台,你直接在那里记录你的消息,你不需要通过系统日志。如果您坚持要使用它,那么您需要使用级别作为参数或编写自己的包装器。这根本不是开发人员想要的用例。