Star

Loggen

Im Unterschied zu anderen Logging-Frameworks hat tinylog einen statischen Logger. Somit kann die Logger-Klasse direkt verwendet werden und es muss keine Instanz des Loggers erzeugt werden.

tinylog unterstützt fünf verschiedene Logging-Level: TRACE < DEBUG < INFO < WARNING < ERROR. Standardmäßig werden nur Log-Einträge mit dem Level INFO und höher (INFO, WARNING und ERROR) ausgegeben und alle anderen Log-Einträge (TRACE und DEBUG) ignoriert.

Die Logging-Methoden tragen den Namen des Logging-Levels (z.B. Logger.trace() für TRACE). Eine Ausnahme bildet WARNING, da die dazugehörigen Logging-Methoden warn() heißen.

Texte

Die wahrscheinlich am häufigsten genutzte Logging-Methode ist die einfache Ausgabe von Texten:

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(String message)

Beispiel:

Logger.trace("Mein Log-Eintrag");

Methoden-Signatur:

Logger.debug(String message)

Beispiel:

Logger.debug("Mein Log-Eintrag");

Methoden-Signatur:

Logger.info(String message)

Beispiel:

Logger.info("Mein Log-Eintrag");

Methoden-Signatur:

Logger.warn(String message)

Beispiel:

Logger.warn("Mein Log-Eintrag");

Methoden-Signatur:

Logger.error(String message)

Beispiel:

Logger.error("Mein Log-Eintrag");

Objekte

Aus Performance-Gründen sollten Objekte nicht einfach per Object.toString() geloggt werden. Für Objekte stellt tinylog eine eigene Methode bereit, die nur die Methode toString() aufruft, wenn der Log-Eintrag auch wirklich ausgegeben werden soll:

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(Object obj)

Beispiel:

Date date = new Date(); Logger.trace(date);

Methoden-Signatur:

Logger.debug(Object obj)

Beispiel:

Date date = new Date(); Logger.debug(date);

Methoden-Signatur:

Logger.info(Object obj)

Beispiel:

Date date = new Date(); Logger.info(date);

Methoden-Signatur:

Logger.warn(Object obj)

Beispiel:

Date date = new Date(); Logger.warn(date);

Methoden-Signatur:

Logger.error(Object obj)

Beispiel:

Date date = new Date(); Logger.error(date);

Texte mit Parametern

Mit der Nutzung von "{}"-Platzhaltern können Texte zur Laufzeit zusammen gebaut werden. Aus Performance-Gründen ist dies der manuellen String-Verkettung über den "+"-Operator vorzuziehen.

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(String message, Object... arguments)

Beispiel:

Logger.trace("Teile {} durch {}", a, b);

Methoden-Signatur:

Logger.debug(String message, Object... arguments)

Beispiel:

Logger.debug("Teile {} durch {}", a, b);

Methoden-Signatur:

Logger.info(String message, Object... arguments)

Beispiel:

Logger.info("Teile {} durch {}", a, b);

Methoden-Signatur:

Logger.warn(String message, Object... arguments)

Beispiel:

Logger.warn("Teile {} durch {}", a, b);

Methoden-Signatur:

Logger.error(String message, Object... arguments)

Beispiel:

Logger.error("Teile {} durch {}", a, b);

Exceptions

Normalerweise ist es sinnvoll, aufgetretene Exceptions mitsamt ihrem Stack-Trace zu loggen, um so später die Fehlersuche zu vereinfachen. Hierfür gibt eine passende Logging-Methode (die "Message" der Exception wird automatisch mit ausgegeben):

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(Throwable exception)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.trace(ex); }

Methoden-Signatur:

Logger.debug(Throwable exception)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.debug(ex); }

Methoden-Signatur:

Logger.info(Throwable exception)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.info(ex); }

Methoden-Signatur:

Logger.warn(Throwable exception)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.warn(ex); }

Methoden-Signatur:

Logger.error(Throwable exception)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.error(ex); }

Exceptions mit eigener Beschreibung

Die "Message" der Exception kann optional um eine eigene Beschreibung ergänzt werden:

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(Throwable exception, String message, Object... arguments)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.trace(ex, "Division von {} durch {} ist fehlgeschlagen", a, b); }

Methoden-Signatur:

Logger.debug(Throwable exception, String message, Object... arguments)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.debug(ex, "Division von {} durch {} ist fehlgeschlagen", a, b); }

Methoden-Signatur:

Logger.info(Throwable exception, String message, Object... arguments)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.info(ex, "Division von {} durch {} ist fehlgeschlagen", a, b); }

Methoden-Signatur:

Logger.warn(Throwable exception, String message, Object... arguments)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.warn(ex, "Division von {} durch {} ist fehlgeschlagen", a, b); }

Methoden-Signatur:

Logger.error(Throwable exception, String message, Object... arguments)

Beispiel:

try { int d = a / b; } catch (ArithmeticException ex) { Logger.error(ex, "Division von {} durch {} ist fehlgeschlagen", a, b); }

Lambda-Ausdrücke

Manchmal muss ein Text oder Parameter extra zum Loggen berechnet werden. Ab tinylog 1.3 können Lambda-Ausdrücke für Texte und Parameter verwendet werden, die aufwendig zu berechnen sind, da Lambda-Ausdrücke nur ausgewertet werden, wenn der Log-Eintrag auch wirklich ausgegeben wird.

TRACE DEBUG INFO WARNING ERROR

Methoden-Signatur:

Logger.trace(Supplier<?> supplier) Logger.trace(String message, Supplier<?>... arguments)

Beispiel:

Logger.trace(() -> compute()); Logger.trace("Aufwendige Berechnung: {}", () -> compute());

Methoden-Signatur:

Logger.debug(Supplier<?> supplier) Logger.debug(String message, Supplier<?>... arguments)

Beispiel:

Logger.debug(() -> compute()); Logger.debug("Aufwendige Berechnung: {}", () -> compute());

Methoden-Signatur:

Logger.info(Supplier<?> supplier) Logger.info(String message, Supplier<?>... arguments)

Beispiel:

Logger.info(() -> compute()); Logger.info("Aufwendige Berechnung: {}", () -> compute());

Methoden-Signatur:

Logger.warn(Supplier<?> supplier) Logger.warn(String message, Supplier<?>... arguments)

Beispiel:

Logger.warn(() -> compute()); Logger.warn("Aufwendige Berechnung: {}", () -> compute());

Methoden-Signatur:

Logger.error(Supplier<?> supplier) Logger.error(String message, Supplier<?>... arguments)

Beispiel:

Logger.error(() -> compute()); Logger.error("Aufwendige Berechnung: {}", () -> compute());

Parameter formatieren

Seit der Version 1.2 unterstützt tinylog das Formatieren von Zahlen und bedingte Formatierungen, in Java Choice-Format genannt. Beides funktioniert analog zu MessageFormat, da tinylog ebenfalls hierzu NumberFormat und ChoiceFormat verwendet. Die Deklaration ist in tinylog allerdings etwas kürzer.

TRACE DEBUG INFO WARNING ERROR

Beispiel Formattierung einer Zahl:

Logger.trace("Einkommen: {0.00} EUR", arg);

Beispiel bedingte Formatierung:

Logger.trace("Insgesamt {0#nichts|1#eine Datei|1<{} Dateien} gefunden", arg);

Beispiel Formattierung einer Zahl:

Logger.debug("Einkommen: {0.00} EUR", arg);

Beispiel bedingte Formatierung::

Logger.debug("Insgesamt {0#nichts|1#eine Datei|1<{} Dateien} gefunden", arg);

Beispiel Formattierung einer Zahl:

Logger.info("Einkommen: {0.00} EUR", arg);

Beispiel bedingte Formatierung::

Logger.info("Insgesamt {0#nichts|1#eine Datei|1<{} Dateien} gefunden", arg);

Beispiel Formattierung einer Zahl:

Logger.warn("Einkommen: {0.00} EUR", arg);

Beispiel bedingte Formatierung::

Logger.warn("Insgesamt {0#nichts|1#eine Datei|1<{} Dateien} gefunden", arg);

Beispiel Formattierung einer Zahl:

Logger.error("Einkommen: {0.00} EUR", arg);

Beispiel bedingte Formatierung::

Logger.error("Insgesamt {0#nichts|1#eine Datei|1<{} Dateien} gefunden", arg);

Logging-Context

Mapped Diagnostic Context (MDC) wird tinylog als Logging-Context bezeichnet und ermöglicht, Log-Einträge threadbasiert mit zusätzlichen Daten anzureichern. Logging-Context steht seit tinylog 1.1 zur Verfügung.

Methoden-Signatur:

LoggingContext.put(String key, Object value))

Beispiel:

LoggingContext.put("user", name);

Einmal in einem Thread gesetzte Werte gelten, bis diese wieder entfernt werden, für alle Log-Einträge, die aus diesem Thread oder einem seiner Unter-Threads heraus angestoßen werden. Ein Unter-Thread kann Werte weitervererben, aber auch (für sich lokal) Werte überschreiben oder entfernen. Für Threads, die in einem Thread-Pool zurückgegeben werden, gilt, dass der Logging-Context vor der Rückgabe geleert werden sollte.