Forskellen mellem java.util.logging.Logger og java.lang.System.Logger
java.lang.System.Logger
er defineret i moduljava.base
mensjava.util.logging.Logger
er defineret i Moduljava.logging
- Understøttelse af ekstern ramme såsom SLF4J eller Log4J er forbedret.
- Evne til at håndtere bootstrap-problemer, så platformsklasser kan scanne logmeddelelser, før logforbrugeren initialiseres.
Logningsniveauerne er ændringer helt anderledes sammenlignet med util.logging.Logger
:
+--------------------------+-----+-------+-------+------+---------+--------+-----+
| System.Logger Levels | ALL | TRACE | DEBUG | INFO | WARNING | ERROR | OFF |
+--------------------------+-----+-------+-------+------+---------+--------+-----+
| java.util.logging Levels | ALL | FINER | FINE | INFO | WARNING | SEVERE | OFF |
+--------------------------+-----+-------+-------+------+---------+--------+-----+
Hvis du vil kende motivationen bag java.lang.System.Logger
, jeg anbefaler dig kraftigt at læse JEP 264:Platform Logging API og Service
Selvom der kan være subtile forskelle mellem dem, er den vigtigste forskel, at System.Logger
(i java.base
modul) er en facade , mens java.util.logging.Logger
(i java.logging
) er en implementering .
Kerneideen bag dette er, at biblioteksforfattere skriver afhængighedsfri logning i deres kode og lader alle brugere af biblioteket levere deres foretrukne implementering. Det betyder også, at hele din applikation vil bruge den samme logningsramme i stedet for at skulle tune loggeren for hvert eneste bibliotek i din kodebase.
Siden JDK 9 er det muligt ikke at have java.logging
i modulgrafen, som virkelig frigør dig til at bruge enhver implementering, du ønsker, uden selv at have ubrugelige pakker i JDK-billedet. I tilfælde java.logging
er til stede, bruges den som standard backend, medmindre en anden backend er til stede. Hvis der ikke er en backend til stede, vil den blot udskrive til System.err
.