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

While there might be subtle differences between them, the most important difference is that System.Logger (in java.base module) is a facade, while java.util.logging.Logger (in java.logging) is an implementation.

The core idea behind this is for library authors to write dependency free logging in their code and let every user of that library provide their favorite implementation. It also means your whole application will use the same logging framework instead of having to tune the logger of each and every library in your codebase.

Since JDK 9 it is possible to not have java.logging in the module-graph, which really frees you to use any implementation you wish without even having useless packages in the JDK image. In case java.logging is present, it's used as the default backend unless a different backend is present. If no backend is present, it will just print to System.err.


  • java.lang.System.Logger is defined in Module java.base while java.util.logging.Logger is defined in Module java.logging
  • External framework support such as SLF4J or Log4J is enhanced.
  • Capability to deal with bootstrap issues, so that platform classes can log messages before the log consumer is initialized.

The logging Levels are changes quite a different as compared to util.logging.Logger:

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

If you want to know the motivation behind java.lang.System.Logger , I strongly advise you to read JEP 264: Platform Logging API and Service