Nach dem ich die von Java mitgelieferte Logger-API vorgestellt habe, möchte in diesen Artikel Log4j von Apache vorstellen.
Diese API hat ein paar Vorteile gegenüber des Standard Loggingsystems von Java. Es lässt sich leichter konfigurieren und einbinden, da eine externe Konfigurationsfile verwendet werden kann. In dieser Konfigurationsdatei kann festgelegt werden, was geloggt und wo dieser Log ausgegeben, oder gespeichert werden soll. Zusätzlich lässt sich dort der Log nach eigenen Wünschen gestalten.
Log4j in ein Projekt einfügen
Als erstes muss die JAR-Datei beschafft werden. Diese ist im Log4j-Paket enthalten, dass von der Projektseite heruntergeladen werden kann.
Nach dem die apache-log4j.zip heruntergeladen wurde, muss diese in ein beliebiges Verzeichnis entpackt werden.
Anschließen kann die benötigte JAR in das bestehende Java-Projekt eingefügt werden.
In Eclipse geht das folgendermaßen:
Rechtsklick auf den Projekt-Ordner -> Properties -> Java Build Path -> Tab: Libraries -> Add External JARs
Nun sucht man im Verzeichnis apache-log nach der log4j.jar und wählt diese aus.
Log4j verwenden
In den Klassen, in denen der Logger verwendet werden soll, muss der Logger mit der Zeile:
private final static Logger log = Logger.getLogger( Log4jDemo.class );
geholt werden.
Dabei ist wichtig, dass der richtige Logger importiert wird und zwar folgender:
org.apache.log4j.Logger
Als nächstes erzeugen wir eine Datei log4j.properties im Sourcecode-Verzeichnis (in Eclipse src).
In dieser Datei wird der Logger konfiguriert.
#Als ersten setzen wir den Root-Logger auf das Log-Level Debug: log4j.rootLogger=DEBUG, A #Dann weisen wir dem Logger "A" einen appender zu und zwar für die Konsolenausgabe: log4j.appender.A=org.apache.log4j.ConsoleAppender #Anschliessend definieren wir noch ein Layout: log4j.appender.A.layout=org.apache.log4j.PatternLayout log4j.appender.A.layout.ConversionPattern=%-5p %c:%t [%L]-> %m%n #und wählen das Ziel der Ausgabe: log4j.appender.A.stdout.Target=System.out
In der gewünschten Klasse kann der Logger nun mit z.B. log.info("Das ist eine Info"); oder log.error("Fehler"); verwendet werden.
Soll die Konfigurationsdatei an einem anderen Ort gespeichert werden, kann die Methode PropertyConfigurator.configure("log4j.properties"); verwendet werden.
Die gesamte Testklasse sieht dann wie folgt aus:
import org.apache.log4j.Logger; public class Log4jDemo { private final static Logger log = Logger.getLogger( Log4jDemo.class ); public static void main( String[] args ) { //PropertyConfigurator.configure("log4j.properties"); log.info("Das ist eine Info" ); log.error("Fehler"); } }
und ergibt diesen Log:
INFO log4j.Log4jDemo:main [17]-> Das ist eine Info ERROR log4j.Log4jDemo:main [18]-> Fehler
Jetzt dürften die Vorteile gegenüber dem Standard Logger klar geworden sein.
In der Klasse befindet sich sehr wenig Code, der für den Logger verwendet wird und der Logger kann schnell und einfach, durch die externe Datei, umkonfiguriert werden.
Eine Sache ist noch zu beachten, sollte man komplexere Werte Loggen wollen, kann mit log.isEnabledFor(Priority.DEBUG) eine Performancesteigerung erreicht werden. So kann geprüft werden, ob überhaupt DEBUG-Werte geloggt werden.