2009-12-15 42 views
36

Tôi muốn định cấu hình trình khởi động khi khởi động và sau đó tự động thêm và xóa nó khỏi các trình ghi nhật ký khác nhau theo yêu cầu. Tôi muốn có log4j cấu hình này appender chính nó, và chỉ cần lấy một tham chiếu đến nó khi cần thiết. Nếu điều đó là không thể, tôi sẽ phải tự mình khởi tạo appender và giữ nó.Tôi làm cách nào để truy cập vào các ứng dụng Log4J được định cấu hình trong thời gian chạy?

+0

Tôi muốn làm chính xác điều tương tự. Tôi muốn cấu hình các appender trong log4j.properties và sau đó chọn một số và thêm vào rootLogger động trong thời gian chạy. – Joel

Trả lời

3

Lớp Logger có phương pháp để getAllAppenders(), getAppender(), addAppender(), và removeAppender() phương pháp, kế thừa từ lớp Category. Tuy nhiên, lớp Danh mục không được chấp nhận và trên hết, tôi chưa bao giờ cố thực hiện điều này trước đây, nhưng đây có thể là điểm bắt đầu hữu ích.

+2

'Danh mục' đã được đánh giá cao bởi lớp 'Logger'. 'Logger' chỉ kế thừa từ' Danh mục'. Vì vậy, nếu chính phương thức 'Category' không được dùng thì nó hoàn toàn tốt để sử dụng. –

+1

Không sử dụng getAppender() hoặc getAllAppenders() giả định rằng ứng dụng đã có trên Logger? Tôi muốn định cấu hình Trình khởi động khi khởi động nhưng không đính kèm nó vào bất kỳ danh mục nào khi khởi động. Chỉ trong thời gian chạy, tôi sẽ lấy nó để gọi addAppender() trên một Logger. –

+0

Bạn có thể làm cho một Appender theo yêu cầu và thêm nó. –

23

Trình bổ sung thường được thêm vào trình ghi nhật ký gốc. Dưới đây là một số mã giả

// get the root logger and remove the appender we want 
Logger logger = Logger.getRootLogger(); 
Appender appender = logger.getAppender("foo"); 
logger.removeAppender(appender) 

// when we want to add it back... 
logger.addAppender(appender); 

Tôi khá chắc chắn bạn có thể thực hiện điều này trên các trình ghi nhật ký khác so với trình ghi nhật ký gốc, mặc dù tôi chưa bao giờ thử điều đó.

+8

Phải, tôi biết tôi có thể lấy một appender tắt của một Logger nếu nó đã được cấu hình để được gắn vào nó. Tuy nhiên, tôi đang tìm một cách để lấy một appender cấu hình lúc khởi động đó là * NOT * đã được gắn vào một logger. –

3

Tôi muốn làm chính xác điều tương tự. Tôi muốn cấu hình các appender trong log4j.properties và sau đó chọn một số và thêm vào rootLogger động trong thời gian chạy.

Tôi không thể tìm cách truy cập các ứng dụng khác thông qua nhật ký mà chúng đã được đính kèm, vì vậy tôi đã tạo một dummy logger và đính kèm ứng dụng vào nó để tôi có thể truy xuất động. Đây không phải là lý tưởng mặc dù như bất kỳ tài nguyên được sử dụng bởi các appenders (ví dụ như các tập tin) được tạo ra trả trước ngay cả khi chúng không được sử dụng.

+0

Tôi nghĩ đây thực sự là giải pháp duy nhất. Đăng ký ứng dụng là riêng tư đối với [PropertyConfigurator] (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html) hoặc [DOMConfigurator] (http://logging.apache.org) /log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html). PropertyConfigurator thậm chí xóa registry của nó sau khi nó được thực hiện. – James

0

tôi sẽ làm điều đó theo cách này:

  1. đã bạn appender quy định tại log4j.properties, nhưng không được thêm vào logger gốc.
  2. khi chạy, khi cần, hãy lấy log4j.properties, trích xuất từ ​​thuộc tính bạn cần, khởi tạo ứng dụng của bạn và đặt tùy chọn bằng cách đọc thuộc tính được trích xuất.
  3. kích hoạt ứng dụng
  4. Logger.getRootLogger(). AddAppender (appender);
  5. kick nó đi khi sử dụng nó xong -. Logger.getRootLogger() removeAppender (..)

Bây giờ, nếu đây là appender của riêng bạn, làm (2) sẽ được dễ dàng kể từ khi bạn biết được ý nghĩa của các tài sản và biết những gì mong đợi. Nếu không, bạn có thể muốn sử dụng sự phản chiếu để khởi tạo lớp và gọi trình định vị thuộc tính của nó trước khi thực hiện (3).

0

Nếu nó cho phép/vô hiệu hóa các ứng dụng trong thời gian chạy mà bạn muốn làm thì tôi tìm thấy một giải pháp khác (mặc dù không phải là rất thanh lịch). Sử dụng cấu hình log4j thêm tất cả các Appenders bạn sẽ cần như bạn làm bình thường.

Vào thời gian chạy khi bạn muốn "tắt" trình bổ sung, hãy thêm Bộ lọc (org.apache.log4j.spi) vào bộ lọc trả về Bộ lọc.DENY cho mọi thông báo tường trình. Bằng cách này, không có thông điệp nào làm cho nó thông qua cho Appender này. Khi bạn muốn "kích hoạt" Appender trở lại chỉ cần xóa Bộ lọc mà bạn đã thêm ở trên.

Tôi đã thử nghiệm tính năng này và nó hoạt động tốt cho chúng tôi (log4j 1.2).

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