2012-06-21 32 views
15

Tôi đã sử dụng SLF4j làm khung đăng nhập của mình, được hỗ trợ bởi log4j. Vấn đề của tôi là tôi đang tìm cách thay đổi mức ghi nhật ký cho trình ghi nhật ký của mình khi chạy.Làm thế nào để thay đổi mức slf4j khi chạy?

Tôi hiểu rằng slf4j không cho phép điều này trực tiếp thông qua API của chính nó và do đó, tôi phải truy cập trực tiếp vào nhà cung cấp đăng nhập. Cá nhân, tôi thấy đây là một sự thiếu hụt rất lớn trong slf4j. Vì vậy, bây giờ câu hỏi của tôi là làm thế nào tôi có thể xác định programatically thông qua slf4j mà nhà cung cấp tôi đang sử dụng? Mục đích lớn nhất của việc sử dụng slf4j là bạn trở thành nhà cung cấp bất khả tri - bạn có thể dễ dàng chuyển đổi giữa hệ thống đăng nhập ưa thích của mình mà không cần phải mã hóa lại bất kỳ thứ gì. Nhưng bây giờ, nếu tôi phải thực hiện các cuộc gọi trực tiếp tới log4j, tôi sẽ mất khả năng đó.

Ít nhất, tôi muốn có thể xác định xem tôi có đang sử dụng log4j làm nhà cung cấp không và nếu có, thì cho phép người dùng chuyển đổi cấp nhật ký.

Nếu tôi làm LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME), kết quả là một phiên bản org.slf4j.impl.Log4jLoggerAdapter và thậm chí không org.apache.log4j.Logger (như tôi đã hy vọng/mong đợi).

Có cách nào để tìm ra điều này không?

Cảm ơn, Eric

+1

Xem: [Cách tìm thư viện nào slf4j đã tự ràng buộc?] (Http://stackoverflow.com/questions/10505418) –

+0

Cảm ơn bạn. Tôi không chắc tại sao tôi lại bỏ lỡ điều đó trong tìm kiếm ban đầu của mình. –

Trả lời

13

SLF4J được thiết kế như một sự trừu tượng cho thư viện, không ứng dụng (tất nhiên, bạn có thể và nên vẫn sử dụng SLF4J trong các cuộc gọi đăng nhập ứng dụng của riêng bạn, cho nhất quán). Trong ứng dụng của riêng bạn, bạn chọn khung công tác logger cơ bản, vì vậy nó là tốt để truy cập vào API log4j trong các phần đăng nhập-cấu hình cụ thể.

Không có cách nào thư viện nên mucking về việc thay đổi cấu hình ghi nhật ký, IMHO, do đó, nó không thích hợp để có trên API SLF4J.

+3

Đủ công bằng, nếu SLF4J chỉ được sử dụng cho thư viện. Tuy nhiên, có vẻ như với tôi rằng một cái gì đó rất linh hoạt trong một thư viện cũng nên có sẵn để sử dụng trong ứng dụng của bạn. Khái niệm về việc có một API duy nhất mà tôi có thể cắm vào bất kỳ khung đăng nhập nào là tuyệt vời. Ngoài ra, thường xuyên hơn không phải là một phần của ứng dụng của bạn kết thúc được tái cấu trúc vào một thư viện tại một số điểm. Để phải recode bất kỳ tài liệu tham khảo để log4j để trở thành slf4j không có ý nghĩa. Nếu SL4j được thiết kế chỉ cho các thư viện (mà tôi không đọc trên trang web slf4j), tôi thấy rằng tầm nhìn ngắn. –

+3

Xin lỗi, không nói rõ: bạn chắc chắn nên sử dụng SLF4J cho các cuộc gọi đăng nhập của ứng dụng. Nhưng trong phần nhỏ mã của bạn đề cập đến việc thay đổi cấu hình ghi nhật ký, chỉ cần truyền nội dung đến các lớp Log4J. Nếu bạn quyết định chuyển đổi triển khai ghi nhật ký, bạn vẫn phải ghi lại bit đó. – artbristol

+0

Đồng ý. Chỉ là cố gắng làm mọi thứ một cách tổng quát. Tôi đoán điều đó không khả thi. Nó thậm chí không phải là một câu hỏi của đúc - Tôi phải thực hiện cuộc gọi bằng cách sử dụng các lớp học Log4j trực tiếp (tức là: sử dụng log4j.Logger thay vì slf4j.LoggerFactory để lấy logger) –

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