Java Logging meistern: Grundlagen & Best Practices
Java Logging Grundlagen
In diesem Tutorial lernen wir Java Logging und seine verschiedenen Komponenten anhand von Beispielen kennen.
Java erlaubt uns, Log-Nachrichten und -Dateien durch den Prozess des Loggings zu erstellen und zu erfassen.
In Java erfordert Logging Frameworks und APIs. Java hat ein eingebautes Logging-Framework im java.util.logging-Paket.
Wir können auch Drittanbieter-Frameworks wie Log4j, Logback und viele mehr für Logging-Zwecke nutzen.
Java Logging Komponenten
Die folgende Abbildung stellt die Kernkomponenten und den Kontrollfluss der Java Logging API (java.util.logging) dar.

1. Logger
Logger-Klasse instanziieren und ihre Methoden für Logging-Zwecke aufrufen.
Nehmen wir ein Beispiel.
Logger logger = Logger.getLogger("neuerLoggerName");
Die getLogger()-Methode der Logger-Klasse wird verwendet, um einen Logger zu finden oder einen neuen zu erstellen. Das String-Argument definiert den Namen des Loggers.
Hier erstellt dies ein neues Logger-Objekt oder gibt einen existierenden Logger mit demselben Namen zurück.
Es ist Konvention, einen Logger nach der aktuellen Klasse mit class.getName() zu definieren.
Logger logger = Logger.getLogger(MeineKlasse.class.getName());
Hinweis: Diese Methode wirft NullPointerException, wenn der übergebene Name null ist.
Jeder Logger hat ein Level, das die Wichtigkeit der Log-Nachricht bestimmt. Es gibt 7 grundlegende Log-Level:
| Log Level (absteigend) | Verwendung |
|---|---|
| SEVERE | schwerwiegender Fehler |
| WARNING | Warnmeldung, potentielles Problem |
| INFO | allgemeine Laufzeitinformation |
| CONFIG | Konfigurationsinformation |
| FINE | allgemeine Entwicklerinformation (Trace-Nachrichten) |
| FINER | detaillierte Entwicklerinformation (Trace-Nachrichten) |
| FINEST | hochdetaillierte Entwicklerinformation (Trace-Nachrichten) |
| OFF | Logging für alle Level deaktivieren (nichts erfassen) |
| ALL | Logging für alle Level aktivieren (alles erfassen) |
Jedes Log-Level hat einen Integer-Wert, der ihren Schweregrad bestimmt, außer den zwei speziellen Leveln OFF und ALL.
Die Nachricht loggen
Standardmäßig werden die oberen drei Log-Level immer geloggt. Um ein anderes Level zu setzen, können wir folgenden Code verwenden:
logger.setLevel(Level.LogLevel); // Beispiel logger.setLevel(Level.FINE);
In diesem Beispiel werden nur Level FINE und höhere Level geloggt. Alle anderen Log-Nachrichten werden verworfen.
Um eine Nachricht zu loggen, nutzen wir die log()-Methode.
logger.log(Level.LogLevel, "log nachricht"); // Beispiel logger.log(Level.INFO, "Dies ist INFO Log Level Nachricht");
Es gibt Kurzmethoden für das Loggen auf gewünschten Levels.
logger.info("Dies ist INFO Log Level Nachricht"); logger.warning("Dies ist WARNING Log Level Nachricht");
Alle Log-Anfragen, die das gesetzte Log-Level passiert haben, werden dann an den LogRecord weitergeleitet.
Hinweis: Wenn ein Loggers Level auf null gesetzt ist, wird sein Level vom Eltern-Logger vererbt und so weiter den Baum hinauf.
2. Filter
Ein Filter (falls vorhanden) bestimmt, ob der LogRecord weitergeleitet werden soll oder nicht. Wie der Name andeutet, filtert er Log-Nachrichten nach spezifischen Kriterien.
Ein LogRecord wird nur vom Logger zum Log-Handler und vom Log-Handler zu externen Systemen weitergegeben, wenn er die spezifizierten Kriterien besteht.
// Filter setzen logger.setFilter(filter); // Filter abrufen Filter filter = logger.getFilter();
3. Handler (Appender)
Der Log-Handler oder Appender empfängt den LogRecord und exportiert ihn an verschiedene Ziele.
Java SE bietet 5 eingebaute Handler:
| Handler | Verwendung |
|---|---|
StreamHandler | schreibt in einen OutputStream |
ConsoleHandler | schreibt auf die Konsole |
FileHandler | schreibt in Datei |
SocketHandler | schreibt auf entfernte TCP-Ports |
MemoryHandler | schreibt in Memory |
Ein Handler kann den LogRecord an einen Filter weitergeben, um erneut zu bestimmen, ob er an externe Systeme weitergeleitet werden kann.
Um einen neuen Handler hinzuzufügen, nutzen wir:
logger.addHandler(handler); // Beispiel Handler handler = new ConsoleHandler(); logger.addHandler(handler);
Um einen Handler zu entfernen:
logger.removeHandler(handler); // Beispiel Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
Ein Logger kann mehrere Handler haben. Um alle Handler zu erhalten:
Handler[] handler = logger.getHandlers();
4. Formatter
Ein Handler kann auch einen Formatter nutzen, um das LogRecord-Objekt in einen String zu formatieren, bevor er an externe Systeme exportiert wird.
Java SE hat zwei eingebaute Formatter:
| Formatter | Verwendung |
|---|---|
SimpleFormatter | formatiert LogRecord zu String |
XMLFormatter | formatiert LogRecord zu XML-Form |
Wir können folgenden Code nutzen, um einen Handler zu formatieren:
// formatiert zu String-Form handler.setFormatter(new SimpleFormatter()); // formatiert zu XML-Form handler.setFormatter(new XMLFormatter());
LogManager
Das LogManager-Objekt behält die globalen Logging-Informationen bei. Es liest und verwaltet die Logging-Konfiguration und die Logger-Instanzen.
Der Log Manager ist ein Singleton, was bedeutet, dass nur eine Instanz davon instanziiert wird.
Um die Log Manager Instanz zu erhalten, nutzen wir:
LogManager manager = LogManager.getLogManager();
Vorteile von Logging
Hier sind einige Vorteile von Logging in Java.
- hilft beim Überwachen des Programmflusses
- hilft beim Erfassen von Fehlern, die auftreten können
- bietet Unterstützung für Problemdiagnose und Debugging
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
- Java Vector verstehen: Verwendung, Funktionen und Vergleich mit ArrayList