Was braucht jede Anwendung (egal ob Web-Anwendung, Batch oder Standalone) und wird meistens vom Entwickler vernachlässigt?! Genau – das Logging. Speziell in Java hat man hier die Qual der Wahl: Apache Log4j, Apache Commons Logging, Java Util Logging/Java Logging API und wie sie alle heißen. Am Ende muss man sich für eins der Frameworks entscheiden oder man setzt slf4j ein und verzögern damit die Entscheidung. Persönlich habe ich mich für Log4j entschieden und möchte Ihnen in diesem Beitrag eine Möglichkeit zeigen, wie man Log4j in einem Java-Programm verwendet.
Um mit Log4j arbeiten zu können, muss die Lib „log4j-1.2.XX.jar“ im Projekt eingebunden werden. Diese kann ganz einfach hier heruntergeladen werden.
Zur Konfiguration von Loggern in Log4j verwende ich immer eine XML-Datei. Diese kann nach folgendem Schema aufgebaut werden:
< ?xml version="1.0" encoding="UTF-8" ?> < !DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- ++++++++ --> <!-- Appender --> <!-- ++++++++ --> <appender name="SIZE_LOG" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="log/Size.log" /> <param name="MaxFileSize" value="10MB" /> <param name="Append" value="true" /> <param name="Threshold" value="ALL" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> <!-- ++++++ --> <!-- Logger --> <!-- ++++++ --> <logger name="de.axxg.log4j" additivity="false"> <level value="ALL" /> <appender -ref ref="SIZE_LOG" /> </logger> </log4j:configuration>
Generell besteht ein Logger aus einem Namen und einem Appender. Der Name sollte immer dem Basis-Package der Anwendung entsprechen! Diese Konvention macht es einfacher einen Logger im Code zu initialisieren. Der Appender definiert folgendes:
Diese Patterns produzieren folgende Ausgaben:
Folgende Optionen sind meiner Meinung nach noch wichtig:
c | Category: Kategorie = Name org.apache |
---|---|
C | Class = Klassennamen |
d | Datum mit Pattern Beispiel: %d{HH:mm:ss,SSS} |
F | Filename |
l | Location. Aufrufende Methode, Quelle, Dateiname und Zeilennummer |
L | Line number |
m | Die eigentliche Meldung |
M | Methodennamen |
n | Line-Separator (Plattformabhängig) |
p | Priorität: DEBUG, INFO, WARN, usw. |
r | Anzahl der Millisekunden seit dem Start der VM |
t | Name des Threads |
Innerhalb der Java-Anwendung muss einmalig der DOM konfiguriert werden. Dies kann man z.B. in einem Static-Block, in der Main-Methode oder in einer Konfigurationsklasse tun. Mittels der „configureAndWatch“-Methode wird aller 60 Sekunden geprüft, ob sich die Konfiguration geändert hat. Diese Methode ist erst seit Log4j Version 1.2.14 verfügbar!
import org.apache.log4j.xml.DOMConfigurator; static { // darf und muss nur einmalig ausgeführt werden! String path; path = "resources/log4j.xml"; DOMConfigurator.configureAndWatch(path); }
Zum Schluss muss man lediglich die Logger initialisieren und mit den entsprechenden Level aufrufen:
Logger mylog = Logger.getLogger(Main.class.getName()); Logger mylogR = Logger.getRootLogger(); mylog.info("Hallo myLog!"); // verschiedene Loglevel! mylogR.debug("Hallo myRootLog!"); mylogR.info("Hallo myRootLog!"); mylogR.warn("Hallo myRootLog!"); mylogR.fatal("Hallo myRootLog!");
Achtung – Statt „Main“ wird in der Zeile 1 der entsprechende Klassenname eingesetzt!
Der Grund, warum ich Log4j mit einer externen Config-XML-Datei nutze, ist folgender:
und das alles, während der Laufzeit ohne REDEPLOY!!! Der Nachteil hingegen ist:
Ein funktionierendes Beispiel befinden sie hier:
[download id=“10″ format=“2″]
Copyright © 2012 AxxG – Alexander Gräsel
Kommentar verfassen