| Home | Torres | Team | Tutorium | Status | Protokolle | Tools | Links |
Status : 25% done



14.05.02     Log4J
14.05.02     KI-Klassendiagramm
24.05.02     JavaDoc
24.05.02     Patterns
24.05.02     Coding Standards


   14.05.02     Log4J

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.

 




   14.05.02     KI-Klassendiagramm



Vortrag incl. *.java's



   14.05.02     JavaDoc

Vortrag ueber JavaDoc von Tobias und Peter.

PowerPoint Folien



   14.05.02     Pattern

Vortrag von Tobias und Peter ueber Design Patterns.

Power Point Folien



   14.05.02     Coding Standarts

Vortrag von David ueber Coding Standarts.

Coding Standarts zum Ueberblick.
Coding Standarts im Beispiel.