2012-11-30 23 views
5

Tôi đang viết một ứng dụng web bằng Java và sử dụng SLF4J để ghi nhật ký.SLF4J, Để tránh viết LoggerFactory.getLogger (MyClassName.class) mỗi lần

Tôi đang trở thành mệt mỏi của văn bản cho dòng dưới đây cho mỗi lớp có sử dụng khai thác gỗ:

private static final Logger logger = LoggerFactory.getLogger(ThisClassName.class); 

Để tránh mã dư thừa, tôi đang nghĩ đến một cái gì đó giống như

interface Loggable { 
    Logger logger(); 
} 

và mỗi lớp có thể chỉ thực hiện giao diện này sau đó một số phép thuật như AOP chèn phần LoggerFactory.

Có ai đã triển khai hoặc biết cách thực hiện điều này không?

Cảm ơn!

Trả lời

12

Bạn đang sử dụng nhật thực? Nếu vậy, tại sao không chỉ sử dụng một mẫu mã với một từ khóa như "logger" và các mẫu sau cho nó:

${:import(org.slf4j.LoggerFactory, org.slf4j.Logger)} 
private final static Logger LOGGER = LoggerFactory.getLogger(${enclosing_type}.class); 

Bằng cách này bạn sẽ chỉ cần gõ "logger", nhấn thay đổi + gian và Bạn xong việc rồi.

+0

Chính xác, đơn giản và không được công việc. Sử dụng AOP chỉ cho vấn đề tầm thường như vậy là một ý tưởng điên IMHO (đặc biệt là nếu dự án của bạn chưa được cấu hình cho AOP) –

0

Ghi nhật ký bằng AOP được minh họa độc đáo trong Here. Dường như không có cách nào để chúng ta có thể chèn logger động vào bên trong một phương thức để ghi lại các chi tiết của việc thực hiện phương thức. Các trường hợp kiểm thử đơn vị có thể xử lý điều đó. Việc ghi nhật ký cuộc gọi phương thức có thể được chăm sóc bởi AOP

1

Bạn có đang sử dụng CDI không? nếu có, hãy tạo phương thức nhà sản xuất và sau đó @Inject bộ ghi nhật ký vào bất kỳ lớp đã bật CDI nào.

@Produces Logger createLogger(InjectionPoint injectionPoint) { 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
} 

Xem http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1662