Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein kleines Beispiel zur einfachen Verwendung / Konfiguration von Logging mit AspectJ:
Service Interface:
Unsere Service Implementierung:
Wir verwenden hier eine statische Methode logger(), deren Implementierung so ausschaut:
So bekommt man immer den gleichen Logger. Will man nun für jede Klasse einen eigenen Logger haben so schreibt man für gewöhnlich
Das bringt direkte Abhängigkeiten zu Logging-Frameworks in den Code.
Eine Alternative dazu wäre ein generischer (Compile time) Logging Aspect, der um den Aufruf
de.tutorials.training.util.Logger.logger() Code webt, welcher den entsprechenden Logger für die
aufrufende Klasse zurückliefert.
Unser Logging - Aspect:
Die Log4j Konfiguration:
Ausgabe:
Gruß Tom
hier mal ein kleines Beispiel zur einfachen Verwendung / Konfiguration von Logging mit AspectJ:
Service Interface:
Java:
package de.tutorials.training;
import static de.tutorials.training.util.Logging.logger;
import de.tutorials.training.service.IService;
import de.tutorials.training.service.internal.Service;
public class Main {
public static void main(String[] args) {
logger().info("Hallo Welt!");
IService service = new Service();
service.operation1();
}
}
Unsere Service Implementierung:
Java:
package de.tutorials.training.service.internal;
import static de.tutorials.training.util.Logging.logger;
import de.tutorials.training.service.IService;
public class Service implements IService {
public void operation1() {
if (logger().isDebugEnabled()) {
logger().debug("test");
}
}
}
Wir verwenden hier eine statische Methode logger(), deren Implementierung so ausschaut:
Java:
package de.tutorials.training.util;
import org.apache.log4j.Logger;
public class Logging {
public static Logger logger(){
return Logger.getLogger("default");
}
}
So bekommt man immer den gleichen Logger. Will man nun für jede Klasse einen eigenen Logger haben so schreibt man für gewöhnlich
Java:
Logger logger = Logger.getLogger(getClass());
Das bringt direkte Abhängigkeiten zu Logging-Frameworks in den Code.
Eine Alternative dazu wäre ein generischer (Compile time) Logging Aspect, der um den Aufruf
de.tutorials.training.util.Logger.logger() Code webt, welcher den entsprechenden Logger für die
aufrufende Klasse zurückliefert.
Unser Logging - Aspect:
Java:
package de.tutorials.training.aspects;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
public aspect Logging {
Logger around() : call(Logger de.tutorials.training.util.Logging.logger()){
Class<?> callingClass = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType();
Logger logger = loggers.get(callingClass);
if (logger == null) {
logger = Logger.getLogger(callingClass);
loggers.put(callingClass, logger);
}
return logger;
}
Map<Class<?>, Logger> loggers = new ConcurrentHashMap<Class<?>, Logger>();
}
Die Log4j Konfiguration:
Code:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.logger.de.tutorials.training=INFO
log4j.logger.de.tutorials.training.service=DEBUG
Ausgabe:
Code:
2009-11-03 12:25:39,823 INFO [de.tutorials.training.Main] - <Hallo Welt!>
2009-11-03 12:25:39,824 DEBUG [de.tutorials.training.service.internal.Service] - <test>
Gruß Tom