2012-08-23 40 views
5

Nếu log4j.properties tôi trông nàyLàm thế nào để có được logger riêng biệt trong log4j?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

Có một cách dễ dàng để có được chỉ là logger com.foo, com.foo.Bar, root, và org.springframework. Và không phải các lớp cụ thể đã được tạo và kế thừa các cấp (IE com.foo.bar.Baz?
Vì mục đích của tôi, tôi muốn tạo một trang quản trị hiển thị các trình ghi nhật ký này và cấp độ của chúng, nhưng không phải tất cả logger, chỉ là những cái đã được cấu hình trực tiếp Hiện tại, tôi đang duyệt qua phân cấp cha cho đến khi tôi gặp một trình ghi có cấp độ khác mà cha mẹ của nó, nhưng có thể ẩn một số trình ghi nhật ký được định cấu hình nếu chúng ở trong hệ thống phân cấp và đặt cùng cấp như thứ gì đó cao hơn.

+1

Đang phân tích cú pháp tệp thuộc tính ra khỏi câu hỏi? –

+0

Không, bằng cách sử dụng log4j lập trình để khám phá trình ghi nhật ký nào đã được định cấu hình và không chỉ kế thừa từ các trình ghi nhật ký khác. – Kodi

Trả lời

4

Bạn có thể làm một cái gì đó như thế này đầu tiên nhận được tất cả logger từ người quản lý nhật ký:.

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

Sau đó, bạn có thể yêu cầu mỗi logger cho mức độ của nó:

Level currentLevel = logger.getLevel(); 

currentLevel sẽ null nếu nó chưa bao giờ được thiết lập một cách rõ ràng. Vì vậy, nếu logger được đặt ở một mức cụ thể trong log4j.properties, bạn sẽ nhận được một giá trị không null. Khác bạn sẽ nhận được một giá trị null. Trình ghi nhật ký gốc luôn báo cáo một mức, vì vậy đó sẽ là một trường hợp đặc biệt. Bằng cách này, bạn sẽ không cần phải phân tích cú pháp tệp log4j.properties.

Vấn đề duy nhất là nếu một nơi nào đó trong mã của bạn, bạn gọi setLevel() trên trình ghi nhật ký, nó cũng sẽ báo cáo không rỗng và xuất hiện trong danh sách của bạn. Đó là vì log4j không biết cách một cấp đã được đặt, chỉ khi nó được đặt ở tất cả. Để phân biệt hai trường hợp này, bạn vẫn cần phải phân tích cú pháp log4j.properties.

Ngoài ra, hãy nhớ rằng điều này chỉ hoạt động trên nhật ký hiện đang được tải. Vì vậy, nếu com.foo.Bar chưa bao giờ được tải, bạn sẽ không thấy nó trong danh sách của bạn ngay cả khi nó được đề cập rõ ràng trong log4j.properties. Log4J không biết về logger không tồn tại mà có thể được tạo ra trong tương lai. Một lần nữa, bạn cần phân tích cú pháp log4j.properties.

+4

Không có getCurrentLoggers() trong LogManager. Log4j 2.2. –

+1

@MagnoC Phải, câu trả lời của tôi là [Log4J v1] (https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html). Log4J v2 vẫn còn hai năm nữa tại thời điểm câu trả lời (phát hành năm 2014). –

+0

Ok. Tôi chỉ cần phàn nàn ... Tôi cần phải đưa Log4J vào lớp Logger của riêng mình (để bảo toàn tên tôi cần phải xóa các JAR Log4J và tạo các lớp của tôi có cùng tên) và thêm các JAR Log4J một lần nữa. Vì vậy, tôi gọi logger thực từ bên trong lớp Logger của tôi (sử dụng tên lớp hoàn chỉnh). Bây giờ tôi có thể kích hoạt và vô hiệu hóa MY logger. Khi vô hiệu hóa, tôi chỉ không vượt qua chuỗi đăng nhập thông qua nhật ký thực. –

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