Log4J
Warum Log4J???
Das loggen von Applikationen bringt normalerweise Performanzeinbußen mit sich.[kennt man ja... die Ausgabe von Meldungen auf einer Konsole verlangsamt das Programm]
Die Architektur sowie Implementierung von Log4J ist entsprechend den laufzeitkritischen Anforderungen von Web-Applikationen optimiert worden.
Wie und wie viel aufgezeichnet wird, kann in einer Konfigurationsdatei eingestellt werden.
Bei log4J können die Komponenten drin bleiben und einfach abgeschaltet werden, und verursachen so keine Performance einbußen.
Das ist ein entscheidender Vorteil gegenüber System.out.println().
Die Hierarchie
Um die Menge der Ausgabe modifizieren und minimieren zu können existiert eine Hierarchie mit den folgenden Log-Leveln:
+ DEBUG - zugeordnete Log-Methode debug(..)
+ INFO - zugeordnete Log-Methode info(..)
+ WARN - zugeordnete Log-Methode warn(..)
+ ERROR - zugeordnete Log-Methode error(..)
+ FATAL - zugeordnete Log-Methode fatal(..)
Log-Level implizieren unterschiedliche Prioritäten. Folgende Rangfolge ist bindend:
DEBUG < INFO < WARN < ERROR < FATAL
Wie Funktioniert das jetzt genau?
package org.apache.log4j;
//Dies ist die Klasse Logger (in älteren Version Category genannt)
public Logger class {
// Creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
// generic printing method:
public void log(Level l, Object message);
}
// wir erhalten eine Logger Instanz mit Namen "com.foo"
Logger logger = Logger.getLogger("com.foo");
// Level setzen. Normaler weise macht man das nicht im
// Programm sondern in der Konfigurationsdatei.
logger.setLevel( Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
// Diese Anfrage ist angeschaltet, denn WARN >= INFO.
logger. warn("Low fuel level.");
// Diese Anfrage ist ausgeschaltet, denn DEBUG < INFO.
logger. debug("Starting search for nearest gas station.");
// Die Logger Instanze barlogger, mit Namen "com.foo.Bar",
// erbt den Level von dem Logger mit Namen
// "com.foo"
// angeschaltet INFO >= INFO.
barlogger. info("Located nearest gas station.");
// ausgeschaltet DEBUG < INFO.
barlogger. debug("Exiting gas station search");
Konfigurationsdatei
Hier definiert man die Komponenten die geloggt werden sollen und wohin die Ausgaben erfolgen sollen(Appender).
Sie kann in XML oder im
Java properties (key=value) format.
geschrieben werden
Als Ziel für die Ausgabe kann hier eine Ausgabedatei angegeben werden. (oder was euch sonst noch so einfällt OutputStream, java.io.Writer, remote Unix Syslog, remote log4j server... usw.)
Man kann auch die Ausgabe modifizieren in dem man PatternLayout benutzt.
So etwas hier "%-4r [%t] %-5p %c %x - %m%n".
Eine Log4J Konfigurationsdatei laden
PropertyConfigurator.configure("logdat.lcf");(oder mit pfad)
Beispiel für eine Konfigurationsdatei
// die Klasse
import com.foo.Bar;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyApp {
static Logger logger = Logger.getLogger(MyApp.class.getName());
public static void main(String[] args) {
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator.configure(args[0]);
logger.info("Entering application.");
Bar bar = new Bar();
bar.doIt();
logger.info("Exiting application.");
}
}
// Konfigurationsdatei
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
output of MyApp
2000-09-07 14:07:41,508 [main] INFO MyApp - Entering application.
2000-09-07 14:07:41,529 [main] INFO MyApp - Exiting application.
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Und hier noch ein paar Beispiele zum rumspielen
Trivial.java
Logdat.lcf // die dazugehörige Konfigurationsdatei
Trivial2.java // ohne Konfigurationsdatei
Vortrag incl. *.java's als ZIP.
|