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!

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top