Java Logging meesteren: fundamentals & best practices
Java Logging fundamentals
In deze tutorial leren we over Java Logging en de verschillende componenten met behulp van voorbeelden.
Java stelt ons in staat logberichten en bestanden te creëren en vast te leggen via het proces van logging.
In Java vereist logging frameworks en APIs. Java heeft een ingebouwd logging framework in het java.util.logging pakket.
We kunnen ook third-party frameworks gebruiken zoals Log4j, Logback, en nog veel meer voor logging doeleinden.
Java Logging componenten
De onderstaande figuur vertegenwoordigt de kerncomponenten en de controlestroom van de Java Logging API (java.util.logging).

1. Logger
De Logger klasse biedt methoden voor logging. We kunnen objecten instantiëren uit de Logger klasse en zijn methoden aanroepen voor logging doeleinden.
Laten we een voorbeeld nemen.
Logger logger = Logger.getLogger("nieuweLoggerNaam");
De getLogger() methode van de Logger klasse wordt gebruikt om een nieuwe Logger te vinden of te creëren. Het string argument definieert de naam van de logger.
Hier creëert dit een nieuwe Logger object of retourneert een bestaande Logger met dezelfde naam.
Het is een conventie om een Logger te definieren na de huidige klasse met behulp van class.getName().
Logger logger = Logger.getLogger(MijnKlasse.class.getName());
Let op: Deze methode gooit NullPointerException als de doorgegeven naam null is.
Elke Logger heeft een level dat het belang van het logbericht bepaalt. Er zijn 7 basis log levels:
| Log Level (in aflopende volgorde) | Gebruik |
|---|---|
| SEVERE | ernstige fout |
| WARNING | waarschuwingsbericht, een potentieel probleem |
| INFO | algemene runtime informatie |
| CONFIG | configuratie informatie |
| FINE | algemene ontwikkelaarsinformatie (tracing berichten) |
| FINER | gedetailleerde ontwikkelaarsinformatie (tracing berichten) |
| FINEST | zeer gedetailleerde ontwikkelaarsinformatie (tracing berichten) |
| OFF | logging uitschakelen voor alle levels (niets vastleggen) |
| ALL | logging inschakelen voor alle levels (alles vastleggen) |
Elk log level heeft een integer waarde die hun severiteit bepaalt, behalve voor twee speciale log levels OFF en ALL.
Het bericht loggen
Standaard worden de bovenste drie log levels altijd gelogd. Om een ander level in te stellen, kunnen we de volgende code gebruiken:
logger.setLevel(Level.LogLevel); // voorbeeld logger.setLevel(Level.FINE);
In dit voorbeeld worden alleen level FINE en levels erboven ingesteld om gelogd te worden. Alle andere logberichten worden gedropt.
Nu om een bericht te loggen, gebruiken we de log() methode.
logger.log(Level.LogLevel, "log bericht"); // voorbeeld logger.log(Level.INFO, "Dit is INFO log level bericht");
Er zijn shorthand methoden voor logging op gewenste levels.
logger.info("Dit is INFO log level bericht"); logger.warning("Dit is WARNING log level bericht");
Alle logverzoeken die de ingestelde log level hebben doorstaan, worden dan doorgestuurd naar de LogRecord.
Let op: Als een logger's level ingesteld is op null, wordt het level geërfd van zijn parent en zo verder op in de boom.
2. Filters
Een filter (als het aanwezig is) bepaalt of de LogRecord doorgestuurd moet worden of niet. Zoals de naam suggereert, filtert het de logberichten volgens specifieke criteria.
Een LogRecord wordt alleen doorgegeven van de logger naar de log handler en van de log handler naar externe systemen als het de gespecificeerde criteria doorstaat.
// een filter instellen logger.setFilter(filter); // een filter ophalen Filter filter = logger.getFilter();
3. Handlers (Appenders)
De log handler of de appenders ontvangen de LogRecord en exporteren het naar verschillende targets.
Java SE biedt 5 ingebouwde handlers:
| Handlers | Gebruik |
|---|---|
StreamHandler | schrijft naar een OutputStream |
ConsoleHandler | schrijft naar console |
FileHandler | schrijft naar bestand |
SocketHandler | schrijft naar remote TCP poorten |
MemoryHandler | schrijft naar geheugen |
Een handler kan de LogRecord doorgeven aan een filter om opnieuw te bepalen of het naar externe systemen doorgestuurd kan worden of niet.
Om een nieuwe handler toe te voegen, gebruiken we de volgende code:
logger.addHandler(handler); // voorbeeld Handler handler = new ConsoleHandler(); logger.addHandler(handler);
Om een handler te verwijderen, gebruiken we de volgende code:
logger.removeHandler(handler); // voorbeeld Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
Een logger kan meerdere handlers hebben. Om alle handlers op te halen, gebruiken we de volgende code:
Handler[] handlers = logger.getHandlers();
4. Formatters
Een handler kan ook een Formatter gebruiken om het LogRecord object te formatteren naar een string voordat het geëxporteerd wordt naar externe systemen.
Java SE heeft twee ingebouwde Formatters:
| Formatters | Gebruik |
|---|---|
SimpleFormatter | formatteert LogRecord naar string |
XMLFormatter | formatteert LogRecord naar XML vorm |
We kunnen de volgende code gebruiken om een handler te formatteren:
// formatteert naar string vorm handler.setFormatter(new SimpleFormatter()); // formatteert naar XML vorm handler.setFormatter(new XMLFormatter());
LogManager
Het LogManager object houdt de globale logging informatie bij. Het leest en onderhoudt de logging configuratie en de logger instanties.
De log manager is een singleton, wat betekent dat er slechts één instantie van geïnstantieerd wordt.
Om de log manager instantie te verkrijgen, gebruiken we de volgende code:
LogManager manager = LogManager.getLogManager();
Voordelen van Logging
Hier zijn enkele van de voordelen van logging in Java.
- helpt bij het monitoren van de flow van het programma
- helpt bij het vastleggen van eventuele fouten die kunnen optreden
- biedt ondersteuning voor probleemdiagnose en debugging
Java
- Java Logging Meesteren: Essentiële Best Practices voor Betrouwbare Code
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
- Java Strings beheersen: aanmaken, methodes en best practices
- Java interfaces meesteren: concepten, implementatie en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
- Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList