2010-01-14 94 views
47

看來,log4j有一些class loading issues(等等),在我看來趨勢是走出log4j走向slf4j。 (休眠停止使用第一個有利於後者)Log4j被棄用而轉向Slf4j嗎?

  1. 它是真的嗎?
  2. slf4j解決log4j中的主要問題是什麼?
  3. slf4j是最後一個詞還是有更好的「下一個log4j」行業標準?

更新:

  • 所以這answer通過delfuego混淆了我,你能接受/反對它?:

您出現於 主要問題已經迷迷糊糊與log4j(和 Apache Commons Logging庫), 即它們有一個可笑的 使用正確的類加載器難以發現和交互 ,因爲它們使用的是 。這裏有一個非常密集的 解釋,並附有示例, ; 的回收信息是 新的日誌記錄框架SLF4J的主要驅動力之一是 完全消除了這些問題。你 可能想要交換它,看看你的生活是否更容易 。

+4

您在http://articles.qos.ch/classloader.html中引用的文章不是關於使用log4j而是使用Jakarta Commons Logging(另一個日誌記錄外觀)加載類的問題。這是SLF4J替代並捆綁了實際底層日誌記錄系統的代碼(包括可能的log4j)以消除這些類加載問題。 – 2010-01-14 13:28:27

+0

可能重複[應該新項目使用logback而不是log4j?](http://stackoverflow.com/questions/178836/should-new-projects-use-logback-instead-of-log4j) – ripper234 2011-11-22 09:44:53

回答

46

Slf4j確實只是一個記錄外觀。但是,Log4j旨在由來自同一作者的Logback繼承。

更新:如果你想知道關於SLF4J的另一個好處,這是事實,以下是不需要(難看)構建了以避免不必要的toString()被稱爲:

if (logger.isDebugEnabled()) { 
    logger.debug("Message: " + bigObject + ", " + anotherBigObject); 
} 

您可以改爲使用參數化的消息:

logger.debug("Message: {}, {}", bigObject, anotherBigObject); 

另見What is the fastest way of (not) logging?

+0

+1:幾天前我有一個非常類似的問題,並開始使用在後臺使用slf4j的Logback。 – lostiniceland 2010-01-14 12:26:50

+0

?!可變參數並不會停止執行功能......是嗎? – 2010-01-14 12:37:02

+4

不,但它確實停止了將對象連接到字符串時發生的toString的執行。日誌記錄代價高昂的主要問題不是對日誌函數的調用,而是日誌字符串的構造! – 2010-01-15 11:25:05

6

望着slf4j page它看起來並不像它會取代 log4j的 - 它只是允許你使用相同的底層日誌框架(比如log4j),這樣庫就可以自動的掛鉤了。

它看起來更像是一個替代Apache Commons Logging比log4j。

3

在我看來,SLF4J具有巨大的優勢,可以通過它提供的橋統一記錄所有使用的庫。其他日誌框架都不允許這樣做。這允許項目順利轉移到SLF4J並忽略依賴關係所做的日誌框架選擇。

+1

slf4j不是日誌記錄框架。這是幾個日誌框架之一的外觀。 – 2010-01-14 13:30:27

18

SLF4J不是Log4j的替代方案,而是提供了一個門面的記錄,所以可以你可以在自己的日誌框架插頭。它主要用於圖書館。 從slf4j.org:

的簡單的日誌門面爲Java或 (SLF4J)用作簡單門面或 抽象關於各種記錄 框架,例如java.util.logging, log4j和logback,允許結束 用戶在部署時插入所需的日誌記錄 框架。

要回答你的問題:被採納SLF4J的框架了,但在你的項目,你可以繼續使用的Log4J(或任何其他)

+0

所以這個答案很混亂:http:// stackoverflow。com/questions/1974705/log4j-and-the-thread-context-classloader/1974775#1974775它意味着slfJ解決了由Log4j創建的所有問題......它可能是除了它的Facade特性外,它還有一個很好的獨立本地日誌記錄實施比log4j更好? – ruchirhhi 2010-01-14 12:15:24

+1

SLF4J需要在其下執行實際的日誌記錄。這仍然可以是Log4j,也可以使用Logback,它本地實現SLF4J接口(SLF4J和Logback由同一人編寫)。 – SteveD 2010-01-14 12:25:57

+0

這只是一個門面。然而,有一個名爲Logback的新實現,旨在成爲SLF4J的一流實現。值得注意的是,SLF4J,Log4J和Logback都是由基本上將Log4J視爲停滯的同一個人創建的。他在StackOverflow上有一個帳戶(用戶名是Ceki),並且傾向於在大多數Log4J/SLF4J線程中重申這一點。 – GaryF 2010-01-14 12:26:45

7

第一:很重要的一點:SLF4J是前端測井(API),它可以在大多數主要的登錄系統下使用:例如log4j或java.util.logging。所以最好將sfl4j與commons-logging進行比較。

關於Log4j的狀態,從The state of java logging(一年前)報價,我還沒有意識到

的一件事是log4j的發展基本上是死的。目前它的版本是1.2,而版本1.3的計劃已經放棄,開發log4j 2.0。但是,目前看來2.0並未處於積極的發展階段。值得注意的是,log4j項目的創始人CekiGülcü已經轉向slf4j(見下文)。

3

Slf4j不是真正的採伐門面。 Slf4j不支持其實現者的許多功能。 簡而言之,我在下面提到了log4j示例。

  • SLF4J不能指定用戶選擇的配置文件,但強制用戶在如此衆多的Java根源之一(使用默認值(log4j.properties或log4j.xml文件),每罐有一個根加JVM根和類或箱)。如果兩個JAR文件具有它,則很難控制哪一個安全使用。
  • Slf4j無法支持所有Log4j級別,例如'致命'。當從Log4j切換到Slf4j的大代碼時,需要進行巨大的代碼更改(例如,決定如何重新排列級別)。
  • 必須選擇兩個關鍵Jar文件(log4j-over-slf4j.jar或slf4j-log4j12.jar)。如果classpath都是,將無法工作。如果隨機選擇一個,會丟失意想不到的功能(例如,log4j-over-slf4j.jar不支持同一類的多個日誌文件;例如一個用於事件日誌,一個用於原始數據日誌)。