In diesem Tutorial lernen wir anhand von Beispielen die Java-Protokollierung und ihre verschiedenen Komponenten kennen.
Mit Java können wir Protokollnachrichten und -dateien während des Protokollierungsprozesses erstellen und erfassen.
In Java erfordert die Protokollierung Frameworks und APIs. Java verfügt über ein integriertes Protokollierungsframework im java.util.logging
Paket.
Wir können auch Frameworks von Drittanbietern wie Log4j, Logback und viele mehr für Protokollierungszwecke verwenden.
Java-Protokollierungskomponenten
Die folgende Abbildung zeigt die Kernkomponenten und den Kontrollfluss der Java Logging API ( java.util.logging
).

1. Logger
Die Logger
Klasse bietet Methoden zur Protokollierung. Wir können Objekte aus der Logger
Klasse instanziieren und ihre Methoden zu Protokollierungszwecken aufrufen.
Nehmen wir ein Beispiel.
Logger logger = Logger.getLogger("newLoggerName");
Die getLogger()
Methode der Logger
Klasse wird verwendet, um eine neue zu finden oder zu erstellen Logger
. Das String-Argument definiert den Namen des Loggers.
Hier wird ein neues Logger
Objekt erstellt oder ein vorhandenes Logger
mit demselben Namen zurückgegeben.
Es ist eine Konvention, ein Logger
nach der aktuellen Klasse mit zu definieren class.getName()
.
Logger logger = Logger.getLogger(MyClass.class.getName());
Hinweis: Diese Methode wird ausgelöst, NullPointerException
wenn der übergebene Name lautet null
.
Jedes Logger
hat eine Ebene, die die Wichtigkeit der Protokollnachricht bestimmt. Es gibt 7 grundlegende Protokollebenen:
Protokollstufe (in absteigender Reihenfolge) | Verwenden |
---|---|
STARK | schwerwiegender Fehler |
WARNUNG | Warnmeldung, ein potenzielles Problem |
DIE INFO | Allgemeine Laufzeitinformationen |
KONFIG | Konfigurationsinformationen |
FEIN | Allgemeine Entwicklerinformationen (Tracing-Nachrichten) |
FINER | detaillierte Entwicklerinformationen (Tracing-Nachrichten) |
FINEST | sehr detaillierte Entwicklerinformationen (Tracing-Nachrichten) |
AUS | Deaktivieren Sie die Protokollierung für alle Ebenen (erfassen Sie nichts) |
ALLE | Aktivieren Sie die Protokollierung für alle Ebenen (erfassen Sie alles) |
Jede Protokollebene hat einen ganzzahligen Wert, der ihren Schweregrad bestimmt, mit Ausnahme von zwei speziellen Protokollebenen OFF
und ALL
.
Protokollieren der Nachricht
Standardmäßig werden die drei obersten Protokollebenen immer protokolliert. Um eine andere Ebene festzulegen, können wir den folgenden Code verwenden:
logger.setLevel(Level.LogLevel); // example logger.setLevel(Level.FINE);
In diesem Beispiel werden nur die Ebene FINE
und die darüber liegenden Ebenen als protokolliert festgelegt. Alle anderen Protokollnachrichten werden gelöscht.
Um nun eine Nachricht zu protokollieren, verwenden wir die log()
Methode.
logger.log(Level.LogLevel, "log message"); // example logger.log(Level.INFO, "This is INFO log level message");
Es gibt Kurzmethoden zum Protokollieren auf den gewünschten Ebenen.
logger.info( "This is INFO log level message"); logger.warning( "This is WARNING log level message");
Alle Protokollanforderungen, die die festgelegte Protokollstufe überschritten haben, werden dann an den LogRecord weitergeleitet .
Hinweis: Wenn die Ebene eines Protokollierers auf festgelegt ist, null
wird seine Ebene von seinem übergeordneten Element usw. im Baum geerbt.
2. Filter
Ein Filter (falls vorhanden) bestimmt, ob der LogRecord weitergeleitet werden soll oder nicht. Wie der Name schon sagt, werden die Protokollnachrichten nach bestimmten Kriterien gefiltert.
Ein LogRecord wird nur dann vom Logger an den Log-Handler und vom Log-Handler an externe Systeme übergeben, wenn er die angegebenen Kriterien erfüllt.
// set a filter logger.setFilter(filter); // get a filter Filter filter = logger.getFilter();
3. Handler (Appender)
Der Log-Handler oder die Appender empfangen den LogRecord und exportieren ihn an verschiedene Ziele.
Java SE bietet 5 integrierte Handler:
Handler | Verwenden |
---|---|
StreamHandler | schreibt an eine OutputStream |
ConsoleHandler | schreibt in die Konsole |
FileHandler | schreibt in eine Datei |
SocketHandler | schreibt auf entfernte TCP-Ports |
MemoryHandler | schreibt in den Speicher |
Ein Handler kann den LogRecord an einen Filter übergeben, um erneut zu bestimmen, ob er an externe Systeme weitergeleitet werden kann oder nicht.
Um einen neuen Handler hinzuzufügen, verwenden wir den folgenden Code:
logger.addHandler(handler); // example Handler handler = new ConsoleHandler(); logger.addHandler(handler);
Um einen Handler zu entfernen, verwenden wir den folgenden Code:
logger.removeHandler(handler); // example Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
Ein Logger kann mehrere Handler haben. Um alle Handler zu erhalten, verwenden wir den folgenden Code:
Handler() handlers = logger.getHandlers();
4. Formatierer
Ein Handler kann das LogRecord- Objekt auch mithilfe eines Formatierers in eine Zeichenfolge formatieren , bevor es in externe Systeme exportiert wird.
Java SE verfügt über zwei integrierte Formatierer :
Formatierer | Verwenden |
---|---|
SimpleFormatter | formatiert LogRecord in Zeichenfolge |
XMLFormatter | Formate LogRecord to XML-Formular |
Wir können den folgenden Code verwenden, um einen Handler zu formatieren:
// formats to string form handler.setFormatter(new SimpleFormatter()); // formats to XML form handler.setFormatter(new XMLFormatter());
LogManager
Das LogManager- Objekt verfolgt die globalen Protokollierungsinformationen. Es liest und verwaltet die Protokollierungskonfiguration und die Protokollierungsinstanzen.
Der Protokollmanager ist ein Singleton, was bedeutet, dass nur eine Instanz davon instanziiert wird.
Um die Protokollmanagerinstanz zu erhalten, verwenden wir den folgenden Code:
LogManager manager = new LogManager();
Vorteile der Protokollierung
Hier sind einige der Vorteile der Anmeldung in Java.
- hilft bei der Überwachung des Programmflusses
- hilft bei der Erfassung eventuell auftretender Fehler
- bietet Unterstützung für die Problemdiagnose und das Debuggen