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.