Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在System.Logger中使用log(DEBUG,msg)而不是DEBUG(msg)?_Java_Logging_Java 9 - Fatal编程技术网

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

Java 为什么在System.Logger中使用log(DEBUG,msg)而不是DEBUG(msg)?,java,logging,java-9,Java,Logging,Java 9,我正在阅读Java9中引入的System.Logger API。我不明白他们为什么开发出如此奇怪的API: System.Logger { public default void log(Level level, String msg){...} } 我称之为奇怪,因为所有流行的日志框架(我知道)都没有将level作为参数,而是按level name命名调用方法。例如: //Log4j logger.error("This is error : " + parameter); //SLF4

我正在阅读Java9中引入的System.Logger API。我不明白他们为什么开发出如此奇怪的API:

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)

如何解释?

关于开发人员意图的问题本质上很难回答,除非您是开发人员

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

摘要:

定义平台类可以用来记录消息的最小日志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…)
  • 日志​(System.Logger.Level、ResourceBundle、String、Throwable)
现在,
System.Logger.Level
有七个级别。想象一下,如果您不必实现两种日志记录方法,而必须实现14种日志记录方法?通常情况下,这些实现看起来完全相同,只是名称有一点变化。这是不明智的

目前,几乎所有现有的日志框架都有一个
log(level,…)
方法,然后
System.Logger
log(…)
的实现通常可以通过从
System.Logger.level
映射到框架的level定义来完成


如果你想记录一条消息


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

可能是因为
#log
方法有很多重载(消费对象、字符串、字符串+对象、字符串+可丢弃、供应商),所以进行所有组合都会很麻烦?@AlexSalauyou请参阅slf4j logger-。例如,调试方法重载了10次。除非您是开发人员,否则很难回答有关开发人员意图的问题。请注意,这不是您使用的日志平台,而是一个允许您将系统日志连接到您使用的任何日志平台的接口。所以易于实现是很重要的。作为对代码进行强化扫描的人,我猜这更像是一种安全观点。在代码中添加.debug()调用时,您正在添加用于生产的调试逻辑。虽然它们本质上是相同的,但可以在运行时更改参数值,因此,在您的代码库中,传递级别参数可能不会被视为或标记为调试逻辑。基于观点:我认为当前语法似乎更灵活,可以根据一些配置将日志从一个级别移动到另一个级别,而在当前的日志框架中,您只能设置要记录的级别以及需要记录的内容是所选代码的级别。您不能灵活地说
log.debug(“这将在明天某个时候作为信息记录”)