2009-06-26 25 views
5

Tôi bắt đầu sử dụng đăng nhập và tôi muốn biết nếu có cách nào tốt hơn để làm điều gì đó. tôi có mã này:Sử dụng và danh sách in lại đăng nhập

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

Tôi có một số nghi ngờ cho đến nay:

  • Mỗi lớp sẽ có một this.logger = LoggerFactory.getLogger(this.getClass().getName()); để tạo ra một logger.
  • Mọi phương thức sẽ có this.logger.debug("method()"); để biết khi nào phương thức được gọi.

Điều đó không tốt. Có cách nào để giải quyết nó không?

Ngoài ra tôi muốn in một danh sách trong .log trong dòng này: this.logger.debug("names: {}", xxxxx);

xxxxx nên được thay thế bằng một cái gì đó để in danh sách. Một lớp vô danh?

Cảm ơn bạn đã đọc!

+0

Câu hỏi đầu tiên là trường hợp sách giáo khoa cho http://en.wikipedia.org/wiki/Aspect-oriented_programming, nhưng tôi không đủ quen thuộc để viết một câu trả lời thực tế. –

Trả lời

4

Sử dụng AspectJlog4j bạn có thể sử dụng tính năng này. Biên dịch mã của bạn với trình biên dịch ajc thay vì javac và sau đó chạy như bình thường với java thực thi.

Bạn cần có aspectjrt.jar và log4j.jar trên đường dẫn lớp.

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

Xem tài liệu AspectJ về cách thay đổi lời gọi TraceMethodCalls.

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

Về

Ngoài ra tôi muốn in một danh sách trong .log trong dòng này: this.logger.debug("names: {}", xxxxx);

Đó là hỗ trợ bởi slf4j/logback theo mặc định . Chỉ cần làm

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

ví dụ

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] 

Hoặc bạn có muốn một cái gì đó đặc biệt khác nhau?

+0

Đã thêm câu trả lời cho câu hỏi danh sách in – jitter

+1

Lưu ý rằng bất kỳ đối tượng nào cũng có thể được in bằng lệnh {} -construction. Đó là một cuộc gọi đến toString(). Nếu bạn cần một kết xuất khác, hãy tạo một trình bao bọc chứa đối tượng mà bạn muốn đăng nhập, với một phương thức toString tùy chỉnh. Xem http://www.mail-archive.com/[email protected]/msg02259.html –

+0

@ Thorbjørn Ravn Andersen: Tôi sẵn sàng làm điều đó với một lớp ẩn danh vì phương thức toString() trong lớp tôi có sử dụng một từ đối tượng. – Macarse

Các vấn đề liên quan