2010-10-12 33 views
5

Tôi có hai lớp trong dự án của mình mà tôi muốn chuyển logger từ lớp chính tới lớp con và có lớp con sử dụng các thiết lập logger của cha mẹ.Truyền một logger giữa các lớp

Lớp phụ là một lớp chung, riêng biệt (tức là không gắn với lớp chính) và phải có khả năng tạo nhật ký riêng nếu không có.

Lớp chính tạo trình ghi nhật ký, thêm trình xử lý bảng điều khiển, trình xử lý tệp và trình định dạng nhật ký và tôi muốn lớp phụ có thể tạm thời ghi đè trình định dạng nhật ký cho các thông điệp nhật ký và sau đó khi lớp chính tiếp tục , quay lại trình định dạng nhật ký của nó.

Tôi đã cố gắng đưa trình ghi vào lớp phụ hoặc tạo một trình ghi mới nếu cần, nhưng tôi nhận được nhiều thông báo trên màn hình và trong tệp nhật ký (có vẻ như đang thêm trình xử lý vào lớp chính thay vì vượt qua nó).

Tôi làm cách nào để thực hiện việc này?

Trả lời

10

Tôi cho rằng bạn đang sử dụng gói java.util.logging. Trong trường hợp đó, bất cứ khi nào và bất cứ nơi nào bạn sử dụng Logger.getLogger (someString), bạn sẽ nhận được cùng một cá thể Logger.

Ví dụ: nếu trong lớp Chính bạn sử dụng Logger log = Logger.getLogger ("myLogger"); , bạn có thể nhận được cùng một logger trong bất kỳ lớp nào khác bằng cách sử dụng Logger.getLogger ("myLogger");

+0

Vì vậy, tôi không cần phải vượt qua logger và thiết lập dụ logger? ví dụ: private void setLogger (Logger logger) { this.logger = logger; } – Omertron

+0

Ok, vì vậy tôi đã làm điều đó, đã thay đổi phương thức để chấp nhận tên chuỗi của trình ghi nhật ký. Bây giờ tôi cần chuyển hướng logFormatter của lớp chính tới trình định dạng lớp cục bộ của tôi, nhưng bây giờ "ghi đè lên" định dạng lớp chính – Omertron

+0

Vâng, bạn có thể "lưu" trình định dạng logger gốc (Main), ví dụ như một trường lớp con, và đặt nó trở lại khi bạn sử dụng xong nó trong phân lớp. Tôi sẽ nói nó đủ an toàn nếu không có sự song đối. Tuy nhiên, thực hành được đề nghị là tất cả các lớp nên sử dụng có logger riêng và có được các cá thể riêng của chúng bằng cách sử dụng Logger.getLogger (LocalClass.class.getName()). – cbaby

0

Đây là những gì tôi có cho đến nay:

public void setLogger(String loggerName) { 
    MySubClass.logger = Logger.getLogger(loggerName); 

    for (Handler handler : logger.getHandlers()) { 
     handler.setFormatter(tmdbFormatter); 
    } 
    logger.setUseParentHandlers(true); 
    logger.setLevel(Level.ALL); 
} 
Các vấn đề liên quan