首先是System.out和System.err。 但是它們不靈活,因此就需要功能豐富的日志記錄(請注意,當時我在上小學)。 可以定制格式記錄的日志,可以記錄到多個目標(文件,控制臺,電子郵件等)。因此log4j出現在1999年 。
但是也產生了其他解決方案,包括java.util.logging –嘗試使用標準JDK日志記錄。 事實證明,這是一次非常成功的嘗試。 java.util.logging于2002年初與JDK 1.4一起出現。幾個月后,由于意識到所有現有記錄器都需要一個通用日志記錄接口,導致apache common-logging 。
Commons Logging的想法是可行的–庫不應在使用它們的應用程序上強制執行特定的日志記錄實現。 因此,每個日志記錄實現都適應于庫使用的通用API –因此您的庫不使用org.apache.log4j.Logger –它使用org.apache.commons.logging.Log,并將其委托給任何日志記錄框架存在于類路徑上。 這樣,您的項目可以使用多個庫,并對所有庫使用單個日志記錄配置。
但是公共記錄不足。 人們說它造成的問題多于解決的問題。 所以的log4j的作者- CekiGülcü SLF4J(簡單記錄門面為Java) -創建了一個新的項目在2005年 。 它旨在成為更好的公共記錄。
Log4j自1999年以來已被廣泛使用,但是它還不夠好,所以請猜測誰創建了一個新項目– logback。 再次是CekiGülcü。 為什么要一個新項目? 好吧,我想是出于政治原因和需要從頭開始替換的舊代碼庫的結合。 無論如何,logback出現在2006年。它比log4j好嗎? 塞基在這里解釋 。
所以回到今天-有很多日志記錄框架和兩個外觀-commons-logging和slf4j。 每個庫都使用不同的庫,而且情況一團糟。 版本不匹配,類路徑上有大量Logger類。 Maven通過至少不允許同一日志記錄實現的多個版本而成功地簡化了這一過程,僅此而已。 而且,如果您不了解上面的所有歷史記錄以及哪個框架用于什么,那么您的項目很可能會遭受這種混亂。
有什么解決方案? 最簡單的方法是使用slf4j和logback。 為什么?
- slf4j具有許多現有實現的橋梁。 這意味著您將刪除log4j.jar并使用log4j-over-slf4j.jar –它在同一軟件包中具有相同的類,只是實現有所不同–它委托使用中的當前slf4j實現。 這樣,所有使用log4j(或任何其他橋接實現)的庫都將與您的logback配置一起使用。 不幸的是,這在java.util.logging中不能很好地工作,因此您必須希望不要有太多的庫決定“最小的依賴范圍”。
- logback優于log4j(相同作者-較新的實現,從以前的錯誤中學習)
- 如果出現了比登錄更好的框架,則可以輕松切換到該框架而無需更改類。
最后,介紹一下日志記錄配置。 它應該在外部,以與其他外部化項目配置相同的方式(最好在相同的位置)。 然后,您應該基于系統的“ config.location”屬性加載它。
(在基于Spring的Web應用程序中,有Log4jWebConfigurer
,但沒有LogbackWebConfigurer
。幸運的是,它很容易編寫,并且有一些基于log4j的現有實現。在web.xml中, logbackConfigLocation
參數應該是: file://${config.lotation}/logback.xml
)
為什么這么簡單的事情變得如此復雜? 因為這并不簡單。 最初沒有考慮太多因素,因此需要在以后進行糾正。 自2006年以來該領域未發生重大變化是一件好事,因此我們可以認為情況保持穩定。
參考: Bozho的技術博客上來自我們的JCG合作伙伴 Bozhidar Bozhanov的 The Logging Mess 。
相關文章 :
- 正確記錄應用程序的10個技巧
- 每個程序員都應該知道的事情
- Java教程和Android教程列表
- 如何解決生產問題
- 每個程序員或架構師都應該知道的9 + 7件事
翻譯自: https://www.javacodegeeks.com/2011/09/java-logging-mess.html