2009-06-26 5 views
5

Я начинаю использовать 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);

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

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

+0

Первый вопрос - это учебник для http://en.wikipedia.org/wiki/Aspect-oriented_programming, но я сам не достаточно знаком с ним, чтобы написать фактический ответ. –

ответ

4

Используя 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] 

Или вы хотите что-то конкретно другое?

+0

Добавлен ответ на вопрос о печатном листе – jitter

+1

Обратите внимание, что любой объект может быть напечатан с помощью {} -конструкции. Это вызов toString(). Если вам нужен другой рендеринг, чем этот, создайте оболочку, содержащую объект, который вы хотите зарегистрировать, с помощью настраиваемого метода toString. См. Http://www.mail-archive.com/[email protected]/msg02259.html –

+0

@ Thorbjørn Ravn Andersen: Я был готов сделать это с анонимным классом, потому что метод toString() в классе, который у меня есть использует одно из объекта. – Macarse

Смежные вопросы