logback einbinden, konfigurieren und nutzen

veröffentlicht am 07. April 2012

Nachdem ich eben schon einen Artikel mit vielen guten Gründen veröffentlicht habe, warum man von log4j auf logback wechseln sollte, demonstriere ich jetzt, wie man logback in die eigene Anwendung einbindet und nutzt.

logback einbinden

Zunächst werden die Module logback-core und logback-classic benötigt. Bei Maven fügt man hierzu einfach folgende Abhängigkeit hinzu:

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.0.1</version>
</dependency>

Ansonsten ist normalerweise keine spezielle Konfiguration notwendig. logback verwendet folgenden Initialisierungsprozess:

  • suche nach logback.groovy im Classpath
  • suche nach logback-test.xml im Classpath
  • suche nach logback.xml im Classpath
  • schreibe Logmeldungen in die Standardausgabe (Nutzung des DefaultConfigurers)

Sobald ein Kriterium (ausgenommen der Fallback Lösung am Ende) eintrifft, wird die entsprechende Konfigurationsdatei verwendet. Die Datei logback-test.xml nimmt eine kleine Sonderstellung ein. Wenn diese Datei bei der Verwendung von Maven in dem Ordner src/test/resources abgelegt wird, sorgt Maven dafür, dass diese Datei nicht mit in das Artefakt aufgenommen wird. Gleiches gilt laut Dokumentation analog für Ant. So können für die auszuliefernde Anwendung und für die Testdurchführung zwei unterschiedliche Konfigurationsdateien verwendet werden.

logback konfigurieren

Da das Logging in jedem Projekt sehr spezifische Anforderungen erfüllen muss, kann ich natürlich kein allumfassendes Musterbeispiel geben. Deshalb soll das folgende Beispiel nur als Einstieg für logback Neulinge dienen und dann mit Hilfe der logback Dokumentation an die jeweiligen Erfordernisse angepasst werden. Es zeigt die Konfiguration des oben angesprochenen DefaultConfigurers, der genutzt wird, falls keine Konfigurationsdatei gefunden werden konnte:

<configuration>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>

	<root level="debug">
		<appender-ref ref="STDOUT" />
	</root>

</configuration>

Hier wird zunächst ein ConsoleAppender namens STDOUT definiert. Der Formatierungsstring kann in folgende relevante Einzelteile zerlegt werden:

Teil Erklärung
%d{HH:mm:ss.SSS} Zeit mit Stunden, Minuten, Sekunden und Millisekunden
[%thread] Name des aktuellen Threads
%-5level Log Level linksausgerichtet darstellen und bis 5 Zeichen mit Leerzeichen auffüllen
%logger{36} Name des Loggers ausgeben. Wird per intelligentem Algorithmus auf maximal 36 Zeichen reduziert (siehe Dokumentation).
%msg Ausgabe der festgelegten Log Meldung
%n Zeilenumbruch

Danach wird der eben definierte Appender dem so genannten root Logger zugewiesen. Dieser greift immer dann, wenn keine speziellere Konfiguration für z.B. ein Package festgelegt wurde.

Dieses einfache Beispiel sollte nun für die gewünschten Logging Eigenschaften angepasst werden. So möchte man z.B. die Log Meldungen sowohl in eine (täglich wechselnde) Datei als auch auf die Standardausgabe schreiben und eine andere Formatierung verwenden. Hierfür nimmt man sich die excellente logback Dokumentation zur Hand.

logback nutzen

Folgend zeige ich eine beispielhafte Verwendung von logback. Man sollte darauf achten, nicht direkt die Klassen von logback, sondern die von der SLF4J API bereitgestellten Klassen zu nutzen. So kann später ohne Probleme auf ein anderes von SLF4J unterstütztes Logging Framework umgestellt werden.

package de.patrickgotthard.logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

	private static final Logger LOG = LoggerFactory.getLogger(Main.class);

	public static void main(final String[] args) {
		LOG.debug("Starting application");
		try {
			throw new Exception("FooBar");
		} catch (final Exception e) {
			LOG.error("Starting the application failed", e);
		}
		LOG.debug("Closing application");
	}

}

Mit der eben gezeigten Standardkonfiguration erfolgt folgende Konsolenausgabe:

05:44:17 [main] DEBUG de.patrickgotthard.logback.Main - Starting application
05:44:17 [main] ERROR de.patrickgotthard.logback.Main - Starting the application failed
java.lang.Exception: FooBar
	at de.patrickgotthard.logback.Main.main(Main.java:13) ~[classes/:na]
05:44:17 [main] DEBUG de.patrickgotthard.logback.Main - Closing application

Ich denke, das sollte als Einstieg in logback zunächst einmal reichen. Schnapp dir die Dokumentation und schau selber, welche mächtigen Features logback sonst noch zu bieten hat :)

Kommentare

Hey, error Logging ohne Stacktrace? Bitte nicht e.getMessage() aufrufen, sondern den kompletten Stracktrace loggen…. sonst gibt es viele Kopfkratzer bei der Fehlersuche :D

Felix

Kommentar #1 von Felix am 09. April 2012


Moin Felix,

hab das Beispiel nun extra für dich angepasst. Ich denke, der Fehler ist nun viel schneller zu identifizieren bei diesem schwierigen Code Beispiel ;)

Gruß
Patrick

Kommentar #2 von Patrick am 10. April 2012



Hinterlasse einen Kommentar