2012-03-30 35 views
10

Tôi nghĩ rằng thành ngữ phổ biến để tạo các trường hợp java.util.logging.Logger là thế này:Làm cách nào để tránh lặp lại chính mình khi tạo trình ghi nhật ký?

public class SomeClassName { 

    private static final Logger LOG = Logger.getLogger(SomeClassName.class.getName()); 

} 

IDE của tôi sẽ quản lý thay đổi dòng một cách thích hợp khi tôi Refactor mã của tôi (thay đổi tên của lớp, ví dụ). Nó vẫn còn lỗi với tôi rằng tôi phải lặp lại tên của lớp học, mặc dù. Những gì tôi thực sự muốn làm là một cái gì đó như Logger.getLogger(getName()) hoặc Logger.getLogger(class.getName()), nhưng điều này không phải là hợp pháp Java trong một initilization tĩnh.

Có cách nào tốt hơn để nhận được nhật ký không liên quan đến việc lặp lại bản thân không?

+0

'Logger logger = new logger.getLogger' - Tôi sẽ lo lắng hơn về logpocalypse sắp xảy ra! –

+0

FYI, xem giải thích trong [FAQ sl4j] (http://www.slf4j.org/faq.html#declaration_pattern), khung công tác khác nhau nhưng có thể là lý do tương tự. – assylias

+0

Cảm ơn, @assylias! Câu hỏi thường gặp đó giải quyết mối quan tâm cụ thể của tôi rất rõ ràng. Cụ thể là "thành ngữ khai báo logger ở trên không có khả năng chống cắt và dán giữa các lớp." Tuy nhiên, nó không cung cấp một giải pháp. –

Trả lời

10

Issue 137 of The Java Specialists' Newsletter giải quyết vấn đề này. Nó khuyên bạn nên áp dụng một nhà máy logger, có thể phát hiện tên lớp thực tế, ví dụ: bằng cách tạo ra một ngoại lệ và phân tích ngăn xếp cuộc gọi.

Cá nhân tôi thấy điều này tệ hơn vấn đề ban đầu, nhưng đây chỉ là 2 xu của tôi. Dù sao đi nữa, về mặt kỹ thuật nó là thú vị, vì vậy ở đây là:

public class LoggerFactory { 
    public static Logger make() { 
    Throwable t = new Throwable(); 
    StackTraceElement directCaller = t.getStackTrace()[1]; 
    return Logger.getLogger(directCaller.getClassName()); 
    } 
} 

... 

public class BetterApplication { 
    private final static Logger logger = LoggerFactory.make(); 

    ... 
} 
+2

Và lý do của downvote là ...? –

+1

Điều này giải quyết mối quan tâm cụ thể của tôi, nhưng tôi đồng ý rằng vấn đề này tồi tệ hơn vấn đề ban đầu và tôi sẽ không sử dụng nó trong mã của mình. Cảm ơn vì ... giải pháp thú vị, mặc dù! :) –

8

Tôi tạo một mẫu mã Eclipse và sử dụng nó mỗi lần.

enter image description here

Bạn chỉ cần gõ logger và nhấn Ctrl + Space để kích hoạt nó.

+3

Tôi không nghĩ đó là những gì đã được hỏi, như OP đặc biệt đề cập rằng IDE của ông quản lý này cho anh ta. –

+2

Tôi nghĩ rằng các mẫu mã tip là hợp lệ như OP đề cập đến IDE của mình quản lý thay đổi tên lớp, không phải là thế hệ ban đầu của dòng. – davidfrancis

+1

PS Bây giờ bạn có thể bao gồm nhập khẩu trong mẫu mã Eclipse - làm cho nó dễ dàng hơn. – davidfrancis

1

Chúng tôi làm điều này:

private Logger log = Logger.getLogger(this.getClass()); 
+4

Điều này không hoạt động đối với nhật ký 'tĩnh'. –

1

tôi sử dụng một plugin gọi log4e là thuận tiện cho khai thác gỗ.

http://log4e.jayefem.de/

Bạn có thể sử dụng nó để tự động thêm trước/sau khi đăng nhập cho một phương pháp hoặc một lớp học nói chung.
Ngoài ra, bạn có thể làm cho nó tự động thay thế System.out.println bằng các câu lệnh logger.
Rất tiện dụng.

0

Có một trick để có được tên của lớp hiện tại từ một bối cảnh static, tôi không thể trích dẫn từ bộ nhớ nhưng nó liên quan đến ném một ngoại lệ bên trong khối tĩnh và đọc dấu vết ngăn xếp để có được tên của lớp. Tuy nhiên, nó khá là hack, vì vậy trong thực tế tôi thấy lặp đi lặp lại bản thân mình tốt hơn so với chơi thủ đoạn như vậy.

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