SLF4J用戶手冊

SLF4J用戶手冊

Simple Logging Facade for Java(SLF4J)用作各種日志框架的簡單外觀或抽象,例如java.util.logging,logback和log4j。SLF4J允許最終用戶在部署時插入所需的日志記錄框架。請注意,啟用SLF4J的庫/應用程序意味著只添加一個強制依賴項,即 slf4j-api-1.8.0-beta2.jar

從1.6.0開始如果在類路徑上沒有找到綁定,則SLF4J將默認為無操作實現(xiàn)。

從1.7.0開始,Logger 界面中的打印方法 現(xiàn)在提供了接受varargs 而不是varargs的變體Object[]。此更改意味著SLF4J需要JDK 1.5或更高版本。在Java下,Java編譯器將方法中的varargs部分轉換為 Object[]。因此,編譯器生成的Logger接口在1.7.x中與1.6.x版本無法區(qū)分。因此,SLF4J版本1.7.x與SLF4J版本1.6.x完全100%無錯或兼容。

自1.7.5記錄器檢索時間顯著改善??紤]到改進的程度,強烈建議用戶遷移到SLF4J 1.7.5或更高版本。

從1.7.9開始,通過將slf4j.detectLoggerNameMismatch系統(tǒng)屬性設置 為true,SLF4J可以自動發(fā)現(xiàn)錯誤命名的記錄器。

Hello World

按照編程傳統(tǒng)中的慣例,這里有一個示例說明使用SLF4J輸出“Hello world”的最簡單方法。它首先得到一個名為“HelloWorld”的記錄器。該記錄器又用于記錄消息“Hello World”。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

要運行此示例,首先需要下載slf4j發(fā)行版,然后解壓縮它。完成后,將文件 slf4j-api-1.8.0-beta2.jar添加到類路徑中。

編譯和運行HelloWorld將導致在控制臺上打印以下輸出。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

打印此警告是因為在類路徑上找不到slf4j綁定。

只要在類路徑中添加綁定,警告就會消失。假設您添加了 slf4j-simple-1.8.0-beta2.jar,以便您的類路徑包含:

  • SLF4J-API-1.8.0-beta2.jar
  • SLF4J-simple-1.8.0-beta2.jar

編譯和運行HelloWorld現(xiàn)在將在控制臺上產(chǎn)生以下輸出。

0 [main] INFO HelloWorld  -  Hello World

典型使用模式

下面的示例代碼說明了SLF4J的典型使用模式。請注意在第15行使用{} -placeholders。請參閱問題“最快的記錄方式是什么?” 在常見問題中了解更多詳情。

1: import org.slf4j.Logger;
 2: import org.slf4j.LoggerFactory;
 3: 
 4: public class Wombat {
 5:  
 6:   final Logger logger = LoggerFactory.getLogger(Wombat.class);
 7:   Integer t;
 8:   Integer oldT;
 9:
10:   public void setTemperature(Integer temperature) {
11:    
12:     oldT = t;        
13:     t = temperature;
14:
15:     logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
16:
17:     if(temperature.intValue() > 50) {
18:       logger.info("Temperature has risen above 50 degrees.");
19:     }
20:   }
21: } 

在部署時與日志記錄框架綁定

如前所述,SLF4J支持各種日志框架。SLF4J發(fā)行版附帶了幾個稱為“SLF4J綁定”的jar文件,每個綁定對應一個受支持的框架。

  • SLF4J-log4j12-1.8.0-beta2.jar

    綁定log4j 1.2版,一個廣泛使用的日志框架。您還需要將log4j.jar放在類路徑上。

  • SLF4J-jdk14-1.8.0-beta2.jar

    綁定java.util.logging,也稱為JDK1.4日志記錄

  • SLF4J-NOP-1.8.0-beta2.jar

    綁定NOP,靜默丟棄所有日志記錄。

  • SLF4J-簡單1.8.0-beta2.jar

    綁定簡單 實現(xiàn),將所有事件輸出到System.err。僅打印INFO級別以上的消息。此綁定在小應用程序的上下文中可能很有用。

  • SLF4J-JCL-1.8.0-beta2.jar

    綁定Jakarta Commons Logging。此綁定將委派所有SLF4J日志記錄到JCL。

  • logback-classic-1.0.13.jar(需要logback-core-1.0.13.jar)

    本機實現(xiàn) SLF4J項目外部還有SLF4J綁定,例如本機實現(xiàn)SLF4J的logback。Logback的 類ch.qos.logback.classic.Logger 是SLF4J 接口 org.slf4j.Logger的直接實現(xiàn)。因此,將SLF4J與logback結合使用會嚴格限制零內(nèi)存和計算開銷。

要切換日志框架,只需替換類路徑上的slf4j綁定。例如,要從java.util.logging切換到log4j,只需將slf4j-jdk14-1.8.0-beta2.jar替換為slf4j-log4j12-1.8.0-beta2.jar即可。

SLF4J不依賴于任何特殊的類裝載機械。實際上,每個SLF4J綁定在編譯時都是硬連線的, 以使用一個且只有一個特定的日志記錄框架。例如,slf4j-log4j12-1.8.0-beta2.jar綁定在編譯時綁定以使用log4j。在您的代碼中,除了slf4j-api-1.8.0-beta2.jar之外,您只需將 您選擇的一個且只有一個綁定放到相應的類路徑位置。不要在類路徑上放置多個綁定。以下是一般概念的圖解說明。

SLF4J接口及其各種適配器非常簡單。熟悉Java語言的大多數(shù)開發(fā)人員應該能夠在不到一小時的時間內(nèi)閱讀并完全理解代碼。不需要類加載器的知識,因為SLF4J不能使用,也不能直接訪問任何類加載器。因此,SLF4J不會遇到使用Jakarta Commons Logging(JCL)觀察到的類加載器問題或內(nèi)存泄漏。

鑒于SLF4J接口及其部署模型的簡單性,新的日志框架的開發(fā)人員應該發(fā)現(xiàn)編寫SLF4J綁定非常容易。

Libraries

廣泛分布的組件和庫的作者可以針對SLF4J接口進行編碼,以避免在其最終用戶上強加日志框架。因此,最終用戶可以通過在類路徑上插入相應的slf4j綁定來在部署時選擇所需的日志框架,稍后可以通過在類路徑上替換現(xiàn)有綁定并重新啟動應用程序來更改。事實證明,這種方法簡單而且非常穩(wěn)健。

從SLF4J版本1.6.0開始,如果在類路徑上找不到綁定,則slf4j-api將默認為無操作實現(xiàn),丟棄所有日志請求。因此,SLF4J版本1.6.0及更高版本將發(fā)出一條關于缺少綁定的警告消息,并繼續(xù)丟棄所有日志請求而不進一步抗議,而不是NoClassDefFoundError因為 org.slf4j.impl.StaticLoggerBinder缺少類而拋出a 。例如,讓Wombat成為一些與生物學相關的框架,具體取決于SLF4J的日志記錄。為了避免在最終用戶上強加日志框架,Wombat的發(fā)行版包括slf4j-api.jar 但沒有約束力。即使在類路徑上沒有任何SLF4J綁定,Wombat的發(fā)行版仍然可以開箱即用,而且不需要最終用戶從SLF4J的網(wǎng)站下載綁定。只有當最終用戶決定啟用日志記錄時,才需要安裝與她選擇的日志框架相對應的SLF4J綁定。

基本規(guī)則 嵌入式組件(如庫或框架)不應聲明對任何SLF4J綁定的依賴性,而只依賴于slf4j-api。當庫聲明對特定綁定的傳遞依賴時,該綁定強加給最終用戶否定SLF4J的目的。請注意,聲明對綁定的非傳遞依賴性(例如,用于測試)不會影響最終用戶。

嵌入式組件中的SLF4J用法也在FAQ中討論,與日志記錄配置,依賴性減少測試有關。

聲明日志記錄的項目依賴項

鑒于Maven的傳遞依賴規(guī)則,對于“常規(guī)”項目(不是庫或框架),可以使用單個依賴性聲明來聲明日志記錄依賴性。

LOGBACK-CLASSIC

如果您希望使用logback-classic作為底層日志記錄框架,那么您需要做的就是將“ch.qos.logback:logback-classic”聲明為pom.xml文件中的依賴項,如下所示。除了logback-classic-1.0.13.jar之外,這還會將slf4j-api-1.8.0-beta2.jar以及logback-core-1.0.13.jar引入到您的項目中。請注意,明確聲明對 logback-core-1.0.13slf4j-api-1.8.0-beta2.jar的依賴是沒有錯的,并且可能需要憑借Maven的“最接近定義”依賴關系強加所述工件的正確版本調(diào)解規(guī)則。

<dependency> 
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.0.13</version>
</dependency>

LOG4J

如果您希望使用log4j作為底層日志記錄框架,您需要做的就是將“org.slf4j:slf4j-log4j12”聲明為pom.xml文件中的依賴項, 如下所示。除了 slf4j-log4j12-1.8.0-beta2.jar之外,這還會將 slf4j-api-1.8.0-beta2.jar以及 log4j-1.2.17.jar導入到您的項目中。請注意,明確聲明對 log4j-1.2.17.jarslf4j-api-1.8.0-beta2.jar的依賴是沒有錯的,并且可能需要憑借Maven的“最接近定義”依賴關系強加所述工件的正確版本調(diào)解規(guī)則。

<dependency> 
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.8.0-beta2</version>
</dependency>

JAVA.UTIL.LOGGING

如果你想使用java.util.logging作為底層日志框架,你需要做的就是在你的pom.xml 文件中聲明“org.slf4j:slf4j-jdk14”作為依賴項,如下所示。除了slf4j-jdk14-1.8.0-beta2.jar之外,這將把 slf4j-api-1.8.0-beta2.jar引入你的項目。請注意,明確聲明對 slf4j-api-1.8.0-beta2.jar的依賴是沒有錯的,并且可能需要憑借Maven的“最接近定義”依賴關系中介規(guī)則強加所述工件的正確版本。

<dependency> 
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.8.0-beta2</version>
</dependency>

兼容性

SLF4J綁定指定一個工件,例如 slf4j-jdk14.jarslf4j-log4j12.jar,用于 slf4j 綁定到底層日志框架,例如java.util.logging和log4j。

從客戶的角度來看,所有版本的slf4j-api都是兼容的。對于任何N和M,使用slf4j-api-N.jar編譯的客戶端代碼將與slf4j-api-M.jar完全匹配。您只需要確保綁定的版本與slf4j-api.jar的版本匹配。您不必擔心項目中給定依賴項使用的slf4j-api.jar版本。

混合不同版本的slf4j-api.jar和SLF4J綁定可能會導致問題。例如,如果您使用的是slf4j-api-1.8.0-beta2.jar,那么您還應該使用slf4j-simple-1.8.0-beta2.jar,使用slf4j-simple-1.5.5.jar將無效。

但是,從客戶端的角度來看,所有版本的slf4j-api都是兼容的。對于任何N和M,使用slf4j-api-N.jar編譯的客戶端代碼將與 slf4j-api-M.jar完全 匹配。您只需要確保綁定的版本與slf4j-api.jar的版本匹配。您不必擔心項目中給定依賴項使用的slf4j-api.jar版本。你可以隨時使用任何版本的slf4j-api.jar,只要slf4j-api.jar的版本及其綁定匹配,你應該沒問題。

在初始化時,如果SLF4J懷疑可能存在slf4j-api與綁定版本不匹配問題,則會發(fā)出有關可疑不匹配的警告。

通過SLF4J整合日志記錄

通常,給定項目將依賴于依賴于SLF4J以外的日志API的各種組件。通常根據(jù)JCL,java.util.logging,log4j和SLF4J的組合查找項目。然后,需要通過單個通道合并日志記錄。SLF4J通過為JCL,java.util.logging和log4j提供橋接模塊來滿足這種常見用例。有關更多詳細信息,請參閱橋接舊API的頁面。

映射診斷上下文(MDC)支持

“映射診斷上下文”本質(zhì)上是由日志框架維護的映射,其中應用程序代碼提供鍵值對,然后日志消息中的日志記錄框架可以插入鍵值對。MDC數(shù)據(jù)在過濾消息或觸發(fā)某些操作方面也非常有用。

SLF4J支持MDC或映射診斷上下文。如果底層日志記錄框架提供了MDC功能,那么SLF4J將委托給底層框架的MDC。請注意,目前只有l(wèi)og4j和logback提供MDC功能。如果底層框架不提供MDC,例如java.util.logging,則SLF4J仍將存儲MDC數(shù)據(jù),但其中的信息需要由自定義用戶代碼檢索。

因此,作為SLF4J用戶,您可以在存在log4j或logback的情況下利用MDC信息,但不會將這些日志記錄框架強制作為依賴項用戶。

有關MDC的更多信息,請參閱 logback手冊中有關MDC章節(jié)。

執(zhí)行摘要

優(yōu)點 描述
在部署時選擇您的日志記錄框架 通過在類路徑上插入適當?shù)膉ar文件(綁定),可以在部署時插入所需的日志記錄框架。
失敗快速操作 由于JVM加載類的方式,框架綁定將在很早的時候自動驗證。如果SLF4J在類路徑上找不到綁定,它將發(fā)出單個警告消息,默認為無操作實現(xiàn)。
流行日志框架的綁定 SLF4J支持流行的日志框架,即log4j,java.util.logging,Simple logging和NOP。該的logback項目支持SLF4J本身。
橋接舊式日志API 通過SLF4J實現(xiàn)JCL,即 jcl-over-slf4j.jar,將允許您的項目逐步遷移到SLF4J,而不會破壞與使用JCL的現(xiàn)有軟件的兼容性。類似地,log4j-over-slf4j.jar和jul-to-slf4j模塊將允許您將log4j和java.util.logging調(diào)用重定向到SLF4J。有關更多詳細信息,請參閱橋接舊API的頁面。
遷移您的源代碼 SLF4J-遷移工具可以幫助您遷移源使用SLF4J。
支持參數(shù)化日志消息 所有SLF4J綁定都支持參數(shù)化日志消息,并顯著提高了性能 結果。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容