Использование входа и печать списков - PullRequest
7 голосов
/ 26 июня 2009

Я начинаю использовать logback, и я хочу знать, есть ли лучшие способы сделать что-то. У меня есть этот код:

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;
}

У меня пока есть некоторые сомнения:

  • Каждый класс будет иметь this.logger = LoggerFactory.getLogger(this.getClass().getName()); для создания регистратора.
  • Каждый метод будет иметь this.logger.debug("method()");, чтобы знать, когда вызывается метод.

Это не выглядит хорошо. Есть ли способ решить это?

Также я хочу напечатать список в .log этой строке: this.logger.debug("names: {}", xxxxx);

ххххх следует заменить чем-то, чтобы напечатать список. Анонимный класс?

Спасибо за чтение!

1 Ответ

7 голосов
/ 27 июня 2009

Используя AspectJ и log4j , вы можете использовать это. Скомпилируйте ваш код с помощью компилятора ajc вместо javac, а затем запустите как обычно с исполняемым файлом java.

Вам необходимо иметь aspectjrt.jar и log4j.jar на пути к классам.

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() + "]");
        }
    }
}

Ознакомьтесь с документацией AspectJ о том, как изменить вызовы TraceMethodCalls.

// e.g. just caputre public method calls
// change this
: (execution(* *.*(..))
// to this
: (execution(public * *.*(..))

Относительно

Также я хочу напечатать список в .log в этой строке: this.logger.debug("names: {}", xxxxx);

По умолчанию поддерживается slf4j / logback. Просто сделай

logger.debug("names: {}", names);

например

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]

Или вы хотите что-то особенное?

...