java.util.logging.Logger 和 java.lang.System.Logger 之间的区别

Difference between java.util.logging.Logger and java.lang.System.Logger

Java 9引入了一个新的logger,即java.lang.System.Logger but we always had java.util.logging.Logger.

这个记录器有什么新功能,它有什么改进之处?

  • java.lang.System.Logger 在模块 java.base 中定义 而 java.util.logging.Logger 是在 Module 中定义的 java.logging
  • 增强了 SLF4J 或 Log4J 等外部框架支持。
  • 处理bootstrap问题的能力,让平台类 可以在初始化日志使用者之前记录消息。

util.logging.Logger 相比,日志记录级别发生了很大的变化:

+--------------------------+-----+-------+-------+------+---------+--------+-----+
|   System.Logger Levels   | ALL | TRACE | DEBUG | INFO | WARNING | ERROR  | OFF |
+--------------------------+-----+-------+-------+------+---------+--------+-----+
| java.util.logging Levels | ALL | FINER | FINE  | INFO | WARNING | SEVERE | OFF |
+--------------------------+-----+-------+-------+------+---------+--------+-----+

如果你想知道java.lang.System.Logger背后的动机,我强烈建议你阅读JEP 264: Platform Logging API and Service

虽然它们之间可能存在细微差别,但最重要的区别是 System.Logger(在 java.base 模块中)是一个 外观,而 java.util.logging.Logger(在 java.logging 中)是一个 实现

这背后的核心思想是让库作者在他们的代码中编写无依赖性日志记录,并让该库的每个用户提供他们最喜欢的实现。这也意味着您的整个应用程序将使用相同的日志记录框架,而不必调整代码库中每个库的记录器。

从 JDK 9 开始,模块图中可能没有 java.logging,这实际上使您可以自由使用任何您想要的实现,甚至 [=27= 中没有无用的包] 图片。如果存在 java.logging,它将用作默认后端,除非存在不同的后端。如果没有后端存在,它只会打印到 System.err.