Logback Nutzung und Drucklisten
Frage
Ich beginne logback mit und ich möchte wissen, ob es gibt bessere Möglichkeiten, etwas zu tun. Ich habe diesen Code:
public class ClassA {
private List<String> l;
private Logger logger;
public ClassA(){
this.logger = LoggerFactory.getLogger(this.getClass().getName());
}
....
public List<String> method() {
this.logger.debug("method()");
List<String> names;
try {
names = otherClass.getNames();
} catch (Exception e) {
String msg = "Error getting names";
this.logger.error(msg);
throw new ClassAexception(msg, e);
}
this.logger.debug("names: {}", xxxxx);
return names;
}
Ich habe einige Zweifel so weit:
- wird jede Klasse einen
this.logger = LoggerFactory.getLogger(this.getClass().getName());
einen Logger zu erstellen. - Jede Methode wird eine
this.logger.debug("method()");
müssen wissen, wann eine Methode aufgerufen wird.
Das sieht nicht gut aus. Gibt es eine Möglichkeit, es zu lösen?
Auch ich möchte eine Liste in der .log in dieser Zeile drucken: this.logger.debug("names: {}", xxxxx);
sollte die xxxxx mit etwas ersetzt werden, um die Liste zu drucken. Eine anonyme Klasse?
Vielen Dank für das Lesen!
Lösung
Mit AspectJ und log4j diese verwenden können. Kompilieren Sie Ihren Code mit ajc Compiler statt javac und führen Sie dann wie gewohnt mit ausführbaren Java-Datei.
Sie müssen die aspectjrt.jar und log4j.jar auf dem Classpath haben.
import org.aspectj.lang.*;
import org.apache.log4j.*;
public aspect TraceMethodCalls {
Logger logger = Logger.getLogger("trace");
TraceMethodCalls() {
logger.setLevel(Level.ALL);
}
pointcut traceMethods()
//give me all method calls of every class with every visibility
: (execution(* *.*(..))
//give me also constructor calls
|| execution(*.new(..)))
//stop recursion don't get method calls in this aspect class itself
&& !within(TraceMethodCalls);
//advice before: do something before method is really executed
before() : traceMethods() {
if (logger.isEnabledFor(Level.INFO)) {
//get info about captured method and log it
Signature sig = thisJoinPointStaticPart.getSignature();
logger.log(Level.INFO,
"Entering ["
+ sig.getDeclaringType().getName() + "."
+ sig.getName() + "]");
}
}
}
Schauen Sie sich die AspectJ Dokumentation darüber, wie die TraceMethodCalls Anrufe ändern.
// e.g. just caputre public method calls
// change this
: (execution(* *.*(..))
// to this
: (execution(public * *.*(..))
In Bezug auf die
Auch ich will eine Liste drucken, in der .log in dieser Zeile:
this.logger.debug("names: {}", xxxxx);
Das ist durch slf4j / logback standardmäßig unterstützt. Just do
logger.debug("names: {}", names);
zum Beispiel
List<String> list = new ArrayList<String>();
list.add("Test1"); list.add("Test2"); list.add("Test3");
logger.debug("names: {}", list);
//produces
//xx::xx.xxx [main] DEBUG [classname] - names: [Test1, Test2, Test3]
Oder haben Sie etwas spezifisch anderes wollen?