2012-06-21 48 views
15

我已經使用SLF4j作爲我的日誌框架,由log4j支持。我的問題是,我正在尋找一種方法來在運行時更改記錄器的日誌記錄級別。如何在運行時更改slf4j級別?

據我所知,slf4j不允許直接通過自己的API,因此,我必須直接訪問日誌記錄提供程序。就我個人而言,我認爲這是slf4j的一個巨大缺陷。所以現在我的問題是我怎樣才能通過slf4j通過編程方式確定我正在使用哪個提供程序?使用slf4j的最大目的是使您成爲提供者不可知論者 - 您可以輕鬆地在您喜歡的日誌記錄系統之間切換,而無需重新編碼任何內容。但是現在,如果我必須直接調用log4j,那麼我就失去了這種能力。

至少,我希望能夠確定我是否使用log4j作爲提供程序,如果是,則允許用戶切換日誌級別。

如果我做LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME),結果是org.slf4j.impl.Log4jLoggerAdapter的一個實例,甚至不是org.apache.log4j.Logger(正如我希望/預期的那樣)。

有沒有什麼辦法可以找到答案?

感謝, 埃裏克

+1

請參閱:[如何找到哪個庫slf4j已綁定自己?](http://stackoverflow.com/questions/10505418) –

+0

謝謝。我不確定爲什麼我錯過了原來的搜索。 –

回答

13

SLF4J被設計成一個抽象的,而不是應用程序(當然,你可以而且應該仍然使用SLF4J在自己的應用程序的日誌調用,一致性)。在您自己的應用程序中,您選擇底層的記錄器框架,因此可以在logging-config特定的部分訪問log4j API。

沒有辦法應該庫改變日誌配置恕我直言,恕我直言,所以它不適合它在SLF4J API。

+3

如果SLF4J僅用於圖書館,那就夠了。但是,在我看來,圖書館中如此靈活的東西也應該可用於您的應用程序。擁有可以插入任何日誌框架的單一API的概念是非常棒的。此外,更多的時候,您的應用程序的一部分最終會被重構到某個庫中。必須重新編碼對log4j的任何引用才能成爲slf4j是沒有意義的。如果SL4j僅爲圖書館設計(我沒有在slf4j網站上閱讀),我發現這是近視。 –

+3

對不起,沒有說清楚:你應該使用SLF4J來處理你的應用程序的日誌記錄調用。但是在你的代碼的一小部分中,處理更改日誌記錄配置,只需將這些內容投到Log4J類。如果您決定切換日誌實現,那麼您必須重寫那一點。 – artbristol

+0

同意。只是試圖一切做一切。我想這是不可行的。這甚至不是鑄造的問題 - 我必須直接使用Log4j類進行調用(即:使用log4j.Logger代替slf4j.LoggerFactory來檢索記錄器) –

相關問題