2011-05-07 57 views
2

我正在考慮使用SLF4j來集成多個日誌記錄框架。SLF4J調試級別配置+日誌框架集成

java.util.logging.Logger類有一個很好的方法,稱爲setLevel(Level newLevel)。它可以在類級別啓用日誌記錄配置,這有助於創建可讀和精簡的痕跡。

我在SLF4J框架中找不到等價物。有沒有? SLF4J記錄器接口不提供這種方法。我已經看到了StackOverflow上的其他問題,並且我已經閱讀了SL4F文檔,但是我無法得出明確的結論。

如果SLF4J不允許我正在尋找的微調,那麼SLF4J的真正好處是什麼?它似乎將綁定框架的有趣功能劃分爲最常見的弱和無用的分母...

如果是這樣,爲什麼我不應該將我所有的代碼轉換爲我最喜歡的Logging框架而不是SLF4J?

編輯:

好了,可能是我在抱怨SLF4J不在這裏回答希望自私。然而,在使用SLF4j集成日誌框架方面,我仍然沒有看到太多的價值,因爲在這個過程中,人們無法訪問這些綁定框架中非常有趣的功能。我能看到的唯一的積極的補充是延遲創建日誌記錄消息打印的對象。

SLF4J是恕我直言,肯定不是許多世界上最好的,它是一個最小的共同點,最小的也是適當的軟件工程。另一方面,現有的日誌框架過於設計並且經常錯過競爭對手提供的關鍵功能。

如果一個需要整合的日誌框架,我看到兩個選項與真正實用價值:1)選擇你最喜歡的日誌框架和你的代碼轉換爲這個框架或ii)創建自己的框架(很容易死人,它只花了我幾個小時)。

我的2美分。對於有不同意見的人我沒有問題。只是從我的實踐經驗中說明我的。

回答

5

如果我理解正確,您正在尋找一種方法來定製特定類應記錄在哪個級別?首先,SLF4J只是一個外觀,它只是重定向到一個選擇的日誌庫(它也可以是java.util.logging),提供一致的API。

因此,與SLF4J一起,您需要true日誌框架,如LogbackLog4J。這些框架中的每一個都提供了一些方法來配置日誌記錄級別,通常使用某種配置文件。例如,請參閱:How to configure logback to skip logging messages from org.package.* with all levels below WARN?

+0

如果我理解正確,您正在尋找一種方法來定製特定類應記錄在哪個級別? >是的,我是。我的抱怨是,這個界面很差...我真的沒有它的價值......你知道有沒有更好的? – JVerstry 2011-05-07 21:56:48

+0

你不能用SLF4J來做這件事,因爲這不是這個API的要點。如果你真的想在運行時配置日誌級別(*爲什麼?*),你必須使用底層框架API(Logback和Log4J都可以輕鬆實現)。但是我實際上從來不需要在運行時修改日誌記錄級別(靜態XML配置文件就足夠了) - 如果你這樣做,還有更多成熟的方法,比如JMX。 – 2011-05-07 22:13:28

+0

好的謝謝。調試複雜代碼(JUnit測試,集成測試等)時,能夠配置日誌記錄級別非常有用。我不打算在運行時改變它。 – JVerstry 2011-05-07 22:22:03

2

使用slf4j有兩大好處。

  1. 您使用API​​而不是實現。在部署時(在將jar放在一起時)而不是在編譯時選擇日誌框架(使用log4j類或java.util.logging類?)。這非常有益 - 我在本地開發時使用簡單的「打印所有日誌消息」橋,併爲實際部署提供複雜的後臺配置。
  2. 日誌字符串中的{}位置佔位符。傳統上所有的參數必須是字符串,這意味着具有複雜表示的對象必須是toString()作爲調用記錄器的一部分。這又意味着需要使用if (logger.debugEnabled)... log(...)結構。 {}佔位符延遲 toString()到之後的 if語句也意味着它可以放在slf4j裏面而不是在你的代碼中。這使得日誌語句更具可讀性。

唯一的缺點是你有一個額外的jar來攜帶,任何容器「在」你可能會提供一個不兼容的版本的類路徑。這發生並且是一種痛苦。

我強烈建議使用slf4j。

編輯:請注意,如果您最喜愛的日誌框架不被slf4j支持,那麼請考慮編寫必要的橋樑並捐贈它,或獲得另一個最愛。

+0

因此,它意味着無法在SLF4J的類級別配置調試級別,對嗎? – JVerstry 2011-05-07 22:05:47

+0

@Jverstry,是的。這純粹是在slf4j之後的日誌框架中,因此您需要相應地配置它。對於log4j,這意味着一個合適的log4j.properties文件。 – 2011-05-07 22:14:14

1

我認爲@Tomasz的含義是,您可以通過使用某種特定於框架的配置文件(.xml,.properties等)而不是slf4j API來完成您正在尋找的內容。我能想到的使用slf4j的主要優點是,客戶端可以輕鬆地將您的軟件與其特定的日誌框架/環境集成,而無需更改代碼(即使它們只獲取二進制形式)。因此,SLF4j(以及其他API,如AWT)似乎在可移植性方面存在一些缺陷。 關於setLevel(),好消息是它不應該很難編碼環繞。也許Level enum將每個級別映射到一個特定的sl4j Logger方法和一個LoggerWrapper接收Level和Logger對象,相應地將調用委託給選定的枚舉。

+0

對不起,本來是@Tomasz回答的評論。 – 2011-05-07 22:22:55

+0

這正是我要做的。我將爲我的所有代碼設計自己的小API,並在交付的Java記錄器之上實現它。如果我想改變這個實現,我仍然可以在不改變我的代碼的情況下做到這一點...... – JVerstry 2011-05-07 22:25:00

+0

@JVestry。如果你曾經感受到開源的衝動,我相信你會發現一堆開心,期待着用戶。哎呀,也許你應該聯繫[sl4j郵件列表](http://www.slf4j.org/mailing-lists.html)的人,看看他們對此有何看法。 – 2011-05-07 22:33:09