java slf4j_SLF4J 使用手冊

原文鏈接? 譯者:zivyu

Java的簡單日志門面( Simple Logging Facade for Java ?SLF4J)作為一個簡單的門面或抽象,用來服務于各種各樣的日志框架,比如java.util.logging、logback和log4j。SLF4J允許最終用戶在部署時集成自己想要的日志框架。

需要注意的是,你的應用啟用SLF4J意味著需要一個額外的依賴:slf4j-api-1.7.19.jar。

從1.6.0開始:如果在class path沒有找到綁定,SLF4J將默認一個無操作的實現。

從1.7.0開始:Logger接口中的打印方法現在提供variants取代了Object[]用來接收可變長參數。這個改變意味著SLF4J需要JDK 1.5或更高的版本。Java編譯器在底層把方法中的可變參數部分轉換成Object[]。因此,編譯器生成的Logger接口在1.7.x版本中和它對應的的1.6.x版本中是沒有區別的。因此SLF4J得1.7.x版本和1.6.x版本是 完全兼容的。

從1.7.5開始:日志的檢索時間有了一個顯著的改善,鑒于這個改善,非常鼓勵用戶遷移到SLF4J 1.7.5或更高的版本。

從1.7.9開始: 通過設置 ?slf4j.detectLoggerNameMismatch 系統屬性為true,SLF4J能自動的 ?spot incorrectly named loggers.

Hello World

按照慣例,下面的示例說明最簡單的方法使用SLF4J輸出”hello world“。他首先獲取一個名為”HelloWorld“的記錄器,這個記錄器用來記錄”HelloWorld“。

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發行版 download the slf4j distribution,然后解壓。做完這些之后,把 slf4j-api-1.7.19.jar添加到你的class path。

編譯運行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.

這個警告會被打印是因為在class path下沒有找到綁定的slf4j。

一旦你添加一個綁定在你的class path下,這個警告將會消失。假設你添加了 slf4j-simple-1.7.19.jar,你的class path包含:

slf4j-api-1.7.19.jar

slf4j-simple-1.7.19.jar

編譯并運行HelloWorld程序,現在在控制臺會有下列輸出:

0?[main]?INFO?HelloWorld?-?Hello?World

典型使用模式

下面的示例代碼表明了SLF4J的典型使用模式。注意15行”{}“的使用,查看 ?“What is the fastest way of logging?”獲取更多細節。

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的發行版附帶的幾個jar被稱為” SLF4J bindings“ ,每個綁定都對應一個支持的框架。

slf4j-log4j12-1.7.19.jar

綁定 ?log4j version 1.2,一個廣泛使用的日志框架,你也需要在class path放置 ?log4j.jar。

slf4j-jdk14-1.7.19.jar

綁定 java.util.logging,也被稱為JDK 1.4 日志。

slf4j-nop-1.7.19.jar

綁定 NOP,默默地打出所有的日志。

slf4j-simple-1.7.19.jar

綁定 ?Simple實現,輸出所有的System.err事件,只有INFO和更高級別的信息會被打印。這個綁定或許 在小應用程序的上下文中非常有用。

logback-classic-1.0.13.jar (requires logback-core-1.0.13.jar)

本地實現:也有SLF4J的綁定在SLF4J項目之外,比如 ?logback 在本地實現了SLF4J。Logback的 ch.qos.logback.classic.Logger?類直接實現了SLF4J的 ?org.slf4j.Logger接口。因此,和logback一起使用SLF4J涉及到嚴格零內存和計算開銷。

切換日志框架,只需要替換class path中的slf4j綁定。比如說,從 ?java.util.logging切換到 log4j,僅僅把 ?slf4j-jdk14-1.7.19.jar替換成 slf4j-log4j12-1.7.19.jar。

SLF4J不依賴于特定的類加載機制。事實上,每個SLF4J綁定在編譯時硬連接來使用一個指定的日志框架。比如說, slf4j-log4j12-1.7.19.jar在編譯時綁定使用log4j。在你的代碼中,除 ?slf4j-api-1.7.19.jar之外,只能有一個你選擇的綁定 到正確的class path 路徑上。不要在class path 放置多個綁定。下面是一個圖表來說明一般的想法。

168dac4022032d26bc34ab7a5348baa7.png

SLF4J接口和他們的各種各樣的適配器非常簡單。大多數熟悉Java語言的開發者應該能在一小時之內讀懂代碼。不需要類加載的知識。因此,SLF4J沒有遭受類加載問題或者 Jakarta Commons Logging (JCL)觀察到的內存泄露問題。

鑒于SLF4J接口的簡單性和它的部署模型,新的日志框架開發者應該覺得很容易編寫SLF4J綁定。

為了避免給他們的終端用戶強加一個日志框架 ,一些組件和庫的作者可能會針對SLF4J接口進行編程。因此,終端用戶在部署時可以通過在classpath插入對應的slf4j綁定來選擇他們期望的日志框架。并且,可以把在classpath存在的綁定替 換到另外一個,然后重啟應用,從而達到切換日志框架的目的,這個方法被證明是非常簡單和健壯的。

SLF4J的1.6.0版本,如果在class path 沒有發現綁定,slf4j-api將默認一個無操作的實現來忽略所有的日志請求。因此,SLF4J從1.6.0版開始發出一個缺少綁定的警告,然后丟棄所有的打印日志請求,而不是拋出?NoClassDefFoundError異 常因為缺少 org.slf4j.impl.StaticLoggerBinder?類 。比如說: Wombat?一些基礎框架依賴于SLF4J來打印日志。為了避免強加一個日志框架給終端用戶,Wombat? 包含 ?slf4j-api.jar但是沒有綁定。在class path 沒有SLF4J綁定的情 況下,Wombat的發行版依然能開箱即用,不需要終端用戶下載從SLF4J網站下載一個綁定。僅僅當終端用戶開啟日志的時候,將需要安裝他選擇的日志框架對應的SLF4J綁定。

基本準則:內置的組件比如庫和框架不應該聲明任何SLF4J的依賴,但是依賴于SLF4J-api。當一個庫在一個指定的綁定聲明一個傳遞依賴,這個強加于終端用戶的綁定否定了SLF4J的目的。注意,在綁定上聲明一個非傳遞性的依賴,比如說 對測試,不影響終端用戶。

聲明項目的日志依賴

鑒于Maven的傳遞依賴規則,對于”regular“項目(不是庫和框架),日志依賴聲明 可以通過一個單獨的依賴聲明來實現。

LOGBACK-CLASSIC: 如果你希望使用 logback-classic?作為底層的日志框架,你需要做的所有事情就是聲明” ch.qos.logback:logback-classic“依賴到你的pom.xml文件中。除了 logback-classic-1.0.13.jar之外,它將拉取 slf4j-api-1.7.19.jar和 logback-core-1.0.13.jar 到你的項目中。注意,顯式的聲明 ?logback-core-1.0.13或 ?slf4j-api-1.7.19.jar沒有錯,并且可能需要強加一個正確的版本。

ch.qos.logback

logback-classic

1.0.13

LOG4J:如果你希望使用log4j作為底層的日志框架,你需要做的所有事情就是聲明” org.slf4j:slf4j-log4j12“依賴到你的pom.xml文件中。除了 slf4j-log4j12-1.7.19.jar之外,它將拉取 slf4j-api-1.7.19.jar和 ?log4j-1.2.17.jar到你的項目 中。注意,顯示地聲明一個依賴 ?log4j-1.2.17.jar或 slf4j-api-1.7.19.jar 沒有錯。并且可能需要強加一個正確的版本

org.slf4j

slf4j-log4j12

1.7.19

JAVA.UTIL.LOGGING:如果你希望使用 ?java.util.logging?作為底層的日志框架,你需要做的所有事情就是聲明” org.slf4j:slf4j-jdk14“依賴到你的pom.xml文件中。除了 slf4j-jdk14-1.7.19.jar之外,它將拉取 ?slf4j-api-1.7.19.jar到你 的項目中。注意,顯示地聲明一個依賴? slf4j-api-1.7.19.jar? 沒有錯。并且可能需要強加一個正確的版本。

org.slf4j

slf4j-jdk14

1.7.19

二進制兼容

一個SLF4J綁定指定一個具體的依賴用來在底層日志框架綁定slf4j,比如說 slf4j-jdk14.jar或 slf4j-log4j12.jar。

不同版本的 slf4j-api.jar和SLF4J綁定混合在一起可能會引起問題。比如說,如果你使用 ?slf4j-api-1.7.19.jar,然后你應該使用 slf4j-simple-1.7.19.jar,使用 slf4j-simple-1.5.5.jar將不會正常工作。

然而,從客戶端的觀點來看,所有版本的 slf4j-api都是兼容的。使用 slf4j-api-N.jar編譯的客戶端代將和 ?slf4j-api-M.jar一起完美運行,N和M都是任意的。你僅僅需要確保你綁定的版本和 slf4j-api.jar?匹配。你不需要擔心項目中給定的依 賴的slf4j-api.jar的版本。你可以使用任何版本的 slf4j-api.jar,只要 slf4j-api.jar的版本和它的綁定匹配,就不會有問題。

在初始化的時間,如果SLF4J懷疑可能有不匹配問題。將會發出關于不匹配的警告信息。

通過SLF4J統一日志

通常,一個給定的項目依賴于各種各樣的組件,這些組件依賴的日志API不是SLF4J。一個項目依賴于一個JCL、java.util.logging、log4j和SLF4J是很常見的。然后通過一個單獨的方式來統一日志變得讓人滿意。SLF4J通過提供對JCL、

java.util.logging、和slf4j的橋接模塊來滿足這個普通的用例。更詳細的內容,請參考 Bridging legacy APIs.

MDC支持

“Mapped Diagnostic Context”本質上是日志框架包含的一個map,應用程序代碼提供了key-value對,這個鍵值對能被日志框架插入到日志信息中去。MDC數據在過濾信息或觸發某些操作時是非常有用的。

SLF4J支持MDC,如果一個底層的日志框架提供了MDC功能,SLF4J將委托給底層日志框架的MDC。注意,現在僅僅只有log4j和logback提供了MDC功能。如果底層日志框架不支持MDC,比如說java.util.loggin,SLF4J將存儲MDC數 據,但是里面的數據需要用戶通過代碼來獲取。

因此,作為一個SLF4J使用者,能利用當 log4j和logback存在時的 MDC信息,但是不能強迫用戶依賴這些日志框架。

行動綱要

Advantage

Description

在部署時候選擇日志框架

通過在class path插入合適的jar,期望的日志框架能在部署時集成。

快速失敗操作

由于虛擬機加載類的方式,很早就自動驗證框架綁定。如果SLF4J沒有在class path 發現一個綁定,它將會發出一個警告信息,并且默認一個無操作的實現。

綁定流行的日志框架

SLF4J支持流行的日志框架,log4J、java.util.logging、Simple logging和NOP。 ?logback天生支持SLF4J。

橋接遺留的logging APIs

通過SLF4J實現JCL,如 ?jcl-over-slf4j.jar,將允許項目遷移到SLF4J,沒有破壞使用JCL的軟件的兼容性。同樣的, ?log4j-over-slf4j.jar?和 ?jul-to-slf4j模塊重定向log4j到SLF4J。查看 ? ? ? ? ? ??Bridging legacy APIs 獲取更多信息

移動你的源碼

slf4j-migrator工具能幫助你遷移你的代碼來使用SLF4J。

支持參數化的日志信息

所有的SLF4J綁定支持參數化的日志信息。并且可以顯著提高性能。 improved performance

d0c1501a6d8bb921cf36400dc89de69f.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259674.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[譯]Java 垃圾回收介紹

說明:這篇文章來翻譯來自于Javapapers 的Java Garbage Collection Introduction 在Java中,對象內存空間的分配與回收是由JVM中的垃圾回收進程自動完成的。和C語言不一樣的是,開發中不需要在Java中寫垃圾回收代碼。這也是使Java更加流行而且幫…

打印三角形

直角三角形 #include<iostream> using namespace std; int main() { int i,j; for(i1;i<10;i) {for(j1;j<i;j) cout<<"*"; cout<<endl; } } ———————————————————————————…

Linux基礎入門學習筆記之二

第三節 用戶及文件權限管理 Linux用戶管理 Linux是可以實現多用戶登錄的操作系統 查看用戶who命令用于查看用戶 shiyanlou是當前登錄用戶的用戶名 pts/0中pts表示偽終端&#xff0c;后面的數字表示偽終端的序號。 后面是當前偽終端啟動時間 創建用戶創建用戶需要root權限&#…

java選填_java基礎填空選擇題

Core Java試題選擇填空題&#xff1a;全部為多選題&#xff0c;只有全部正確才能得分。1. 編譯java程序的命令是__B_;運行java程序的命令是____A____;產生java文擋的命令是_____D___;查詢java類型是否是serializable類型的命令是___C_____;產生java安全策略文件的命令是____E__…

這幾天有django和python做了一個多用戶博客系統(可選擇模板) 沒完成,先分享下...

這個TBlog已經全新改版了&#xff0c;更名為UUBlog 新版地址&#xff1a; 用Python和Django實現多用戶博客系統——UUBlog 斷斷續續2周時間吧&#xff0c;用django做了一個多用戶博客系統&#xff0c;現在還沒有做完&#xff0c;做分享下,以后等完善了再慢慢說 做的時候房展了博…

Hibernate的generator屬性

本文講述Hibernate的generator屬性的意義。Generator屬性有7種class&#xff0c;本文簡略描述了這7種class的意義和用法。[xhtml] view plaincopy <class name"onlyfun.caterpillar.User" table"USER"> <id name"id" type"stri…

java 對象池 博客_Java對象池技術的原理及其實現的小結

一起學習Java對象的生命周期大致包括三個階段&#xff1a;對象的創建&#xff0c;對象的使用&#xff0c;對象的清除。因此&#xff0c;對象的生命周期長度可用如下的表達式表示&#xff1a;T T1 T2 T3。其中T1表示對象的創建時間&#xff0c;T2表示對象的使用時間&#xff0c…

matlab中gatbx工具箱的添加

1. 從http://crystalgate.shef.ac.uk/code/下載工具箱壓縮包gatbx.zip 2. 解壓gatbx.zip&#xff0c;將其子文件夾genetic放在matlab安裝目錄toolbox文件夾下 3. 在matlab主窗口選擇File -> Set Path&#xff0c; 單擊"Add Folder"按鈕&#xff0c;找到工具箱所在…

C#與數據庫訪問技術總結(十七)

使用DataSet對象訪問數據庫 當對DataSet對象進行操作時&#xff0c;DataSet對象會產生副本&#xff0c;所以對DataSet里的數據進行編輯操作不會直接對數據庫產生影響&#xff0c;而是將DataRow的狀態設置為added、deleted或changed&#xff0c;最終的更新數據源動作將通過DataA…

MySQL數據高級查詢之連接查詢、聯合查詢、子查詢

2019獨角獸企業重金招聘Python工程師標準>>> 一、連接查詢 連接查詢: 將多張表(>2)進行記錄的連接(按照某個指定的條件進行數據拼接)。 連接查詢的意義: 在用戶查看數據的時候,需要顯示的數據來自多張表. 連接查詢: join, 使用方式: 左表 join 右表&#xff1b;左…

Oracle11g解鎖報錯SP2-0306-選項無效

普通用戶登錄isqlplus: (一)在瀏覽器中輸入URL &#xff08;http://localhost:5560/isqlplus&#xff09;。顯示登錄界面 這里只能用普通用戶進行登錄&#xff0c;因為要用sys登錄&#xff0c;必須用sys的DBA身份登錄。所以用普通用戶SCOTT&#xff0c;但是還未解鎖 問題:SP2-0…

java web登錄action_JavaWeb中登陸功能

首先我們要JavaWeb登陸的基本流程&#xff1a;JSP頁面發送請求——>Servlet——>Servlet通過調用方法從數據庫中得到數據并將結果返回頁面我們先建立三個jsp頁面&#xff0c;包括login.jsp(登陸頁面)、index.jsp(顯示登陸成功后的信息)、error.jsp(登錄失敗的頁面)&#…

Android Download Manager用法大全

http://www.trinea.cn/android/android-downloadmanager/ http://www.trinea.cn/android/android-downloadmanager-pro/轉載于:https://www.cnblogs.com/soaringEveryday/articles/4135204.html

Chrome瀏覽器無法觀看視頻,一直提示“adobe flash player 已過期” ?

很多新用戶在安裝了Chrome瀏覽器或者更新過的的時候&#xff0c;經常提示“ adobe flash player 已過期”的問題&#xff0c;反復提示&#xff0c;導致無法觀看視頻。于是從網上也找了很多辦法都沒有解決。這里給大家提供一個最完美的解決方案。經親自測試&#xff0c;完美解決…

關于JVM的垃圾回收GC的一些記錄

目錄 一、JVM內存區域劃分 二、從一個基本問題開始引入垃圾回收 三、GC作用的區域 三、如何確定一個對象是否可以被當成垃圾進行回收 &#xff08;1&#xff09;引用計數法 &#xff08;2&#xff09;可達性分析算法 &#xff08;3&#xff09;引用的類型 &#xff08;3…

同步與互斥

有數據交互的進程之間的關系主要有兩種,同步與互斥.所謂互斥,是指在不同進程之間的若干程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段后才可以運行.所謂同步,是指在不同進程之間的若干程序片斷,它們的…

java 分號 轉義_java – 正則表達式和轉義和未轉義的分隔符

你可以使用正則表達式(?:\\.|[^;\\])*匹配未轉義分號之間的所有文本&#xff1a;List matchList new ArrayList();try {Pattern regex Pattern.compile("(?:\\\\.|[^;\\\\])*");Matcher regexMatcher regex.matcher(subjectString);while (regexMatcher.find())…

OpenCV cv::Mat類

using namespace cv; 1、Mat的聲明&#xff1a; Mat mMat(rows, cols, type); Mat mMat(Size(width,height), type); type指矩陣中元素的類型&#xff0c;可以使CV_8U&#xff08;無符號單字節像素&#xff09;&#xff0c;CV_8S&#xff08;有符號單字節像素&#xff09;&…

ubuntu-E:Encountered a section with no Package: header的解決辦法

ubuntu 11.04 出現了如下錯誤&#xff1a; E:Encountered a section with no Package: header 終端中輸入以下兩條命令&#xff1a; sudo rm /var/lib/apt/lists/* -vfsudo apt-get update 執行完了命令之后&#xff0c;軟件更新器應該會自動要求更新的&#xff0c;更新便是。 …

java new collection_使用Java 8新增的Predicate操作Collection集合

Java 8 起為 Collection 集合新增了一個 removeIf(Predicate filter) 方法&#xff0c;該方法將會批量刪除符合 filter 條件的所有元素。該方法需要一個 Predicate 對象作為參數&#xff0c;Predicate 也是函數式接口&#xff0c;因此可使用 Lambda 表達式作為參數。如下程序示…