Java-Protokollierung
Java-Protokollierung
In diesem Tutorial lernen wir Java Logging und seine verschiedenen Komponenten anhand von Beispielen kennen.
Java ermöglicht es uns, Protokollnachrichten und -dateien durch den Protokollierungsprozess zu erstellen und zu erfassen.
In Java erfordert die Protokollierung Frameworks und APIs. Java hat ein eingebautes Protokollierungs-Framework in 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 stellt die Kernkomponenten und den Kontrollfluss der Java Logging API (java.util.logging
).
1. Logger
Die Logger
Die Klasse stellt Methoden für die Protokollierung bereit. Wir können Objekte aus Logger
instanziieren Klasse und ruft ihre Methoden für Protokollierungszwecke auf.
Nehmen wir ein Beispiel.
Logger logger = Logger.getLogger("newLoggerName");
Die getLogger()
Methode des Logger
Klasse wird verwendet, um einen neuen Logger
zu finden oder zu erstellen . Das String-Argument definiert den Namen des Loggers.
Hier wird ein neuer Logger
erstellt -Objekt oder gibt ein vorhandenes Logger
zurück mit demselben Namen.
Es ist eine Konvention, einen Logger
zu definieren nach der aktuellen Klasse mit class.getName()
.
Logger logger = Logger.getLogger(MyClass.class.getName());
Hinweis: Diese Methode löst NullPointerException
aus wenn der übergebene Name null
ist .
Jeweils Logger
hat eine Ebene, die die Wichtigkeit der Protokollnachricht bestimmt. Es gibt 7 grundlegende Protokollebenen:
Protokollebene (in absteigender Reihenfolge) | Verwenden |
---|---|
SCHWER | schwerwiegender Fehler |
WARNUNG | Warnmeldung, ein potenzielles Problem |
INFO | allgemeine Laufzeitinformationen |
KONFIG | Konfigurationsinformationen |
FEIN | allgemeine Entwicklerinformationen (Tracing-Meldungen) |
FEINER | detaillierte Entwicklerinformationen (Tracing-Meldungen) |
FEINSTE | sehr detaillierte Entwicklerinformationen (Tracing-Meldungen) |
AUS | Protokollierung für alle Ebenen ausschalten (nichts erfassen) |
ALLE | Protokollierung für alle Ebenen aktivieren (alles erfassen) |
Jede Protokollebene hat einen ganzzahligen Wert, der ihren Schweregrad bestimmt, mit Ausnahme von zwei speziellen Protokollebenen OFF
und ALL
.
Nachricht protokollieren
Standardmäßig werden immer die obersten drei Protokollebenen protokolliert. Um ein anderes Level einzustellen, können wir den folgenden Code verwenden:
logger.setLevel(Level.LogLevel);
// example
logger.setLevel(Level.FINE);
In diesem Beispiel nur Level FINE
und Ebenen darüber sind so eingestellt, dass sie protokolliert werden. Alle anderen Protokollmeldungen werden gelöscht.
Um nun eine Nachricht zu protokollieren, verwenden wir den log()
Methode.
logger.log(Level.LogLevel, "log message");
// example
logger.log(Level.INFO, "This is INFO log level message");
Es gibt Kurzverfahren zum Protokollieren auf gewünschten Ebenen.
logger.info( "This is INFO log level message");
logger.warning( "This is WARNING log level message");
Alle Log-Anfragen, die das eingestellte Log-Level überschritten haben, werden dann an den LogRecord weitergeleitet .
Hinweis: Wenn das Level eines Loggers auf null
eingestellt ist , seine Ebene wird von seinem übergeordneten Element geerbt und so weiter im Baum.
2. Filter
Ein Filter (sofern vorhanden) bestimmt, ob der LogRecord weitergeleitet werden soll oder nicht. Wie der Name schon sagt, filtert es die Logmeldungen nach bestimmten Kriterien.
Ein LogRecord wird nur dann vom Logger an den Loghandler und vom Loghandler an externe Systeme weitergegeben, 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 erhalten den LogRecord und exportiert es an verschiedene Ziele.
Java SE bietet 5 integrierte Handler:
Handler | Verwenden |
---|---|
StreamHandler | schreibt in OutputStream |
ConsoleHandler | schreibt auf Konsole |
FileHandler | schreibt in Datei |
SocketHandler | schreibt auf entfernte TCP-Ports |
MemoryHandler | schreibt in den Speicher |
Ein Handler kann den LogRecord übergeben einem Filter, um erneut zu bestimmen, ob es 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 auch einen Formatter verwenden um den LogRecord zu formatieren Objekt in einen String, bevor Sie es in externe Systeme exportieren.
Java SE verfügt über zwei integrierte Formatierer :
Formatierer | Verwenden |
---|---|
SimpleFormatter | formatiert LogRecord zu besaiten |
XMLFormatter | formatiert LogRecord ins 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
Der LogManager Objekt verfolgt die globalen Logging-Informationen. Es liest und verwaltet die Logging-Konfiguration und die Logger-Instanzen.
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 Protokollierung in Java.
- hilft bei der Überwachung des Programmablaufs
- hilft bei der Erfassung eventuell auftretender Fehler
- bietet Unterstützung bei der Problemdiagnose und Fehlerbehebung
Java