爲何使用SLF4J比使用log4j或者java.util.logging更好

一、SLF4j是什麼?

SLF4J 並無真正地實現日誌記錄,它只是一個容許你使用任何java日誌記錄庫的抽象適配層。java

若是你正在編寫內部或者外部使用的API或者應用庫的話,若是使用了slf4j,那麼你不須要讓使用你所編寫的庫的客戶端去選擇日誌庫。後端

簡短的說,SLF4J讓你的代碼獨立於任何特定的日誌記錄API,這個好的想法尤爲適合於公共的API開發人員。api

日誌記錄庫的抽象理念不是新的,並且Apache的commons logging日誌記錄庫也是用了這個理念,不過如今SLF4J很快就會成爲Java世界裏標準的日誌記錄庫。 框架

二、Why使用SLF4J,也不肯使用Log4J,logback和java.util.Logging

正如我前面所說,在你的代碼中編寫日誌記錄語句使用SLF4J的主要動機是讓你的程序獨立於任何特定的日誌記錄庫,這些日誌記錄庫可能須要與你如今配置不一樣的配置,並且還會引入更多使人頭疼的維護問題。maven

然而除了這個以外,SLF4J API還有一個讓你使用SLF4J而不是用長期感興趣的 Log4j 更讓人信服的功能,也就是佔位符功能,在代碼中用{}來表示。工具

佔位符功能與 String的format()方法中 的%s很是類似,由於它在運行時刻才提取所提供的真正的字符串。這不只縮減了代碼中的許多字符串鏈接,並且減小了建立String對象所須要的資源。spa

即使在你生產環境日誌級別好比DEBUG和INFO級別的字符串鏈接可能不須要的時候,仍然能夠起到一樣的效果。.net

因爲 字符串是不可更改的 ,並且它們是在字符串池中建立的,這些字符串使用了 堆內存 ,當應用在生產環境中運行在ERROR級別的時候,字符串在大多數狀況下就不是必須的,好比DEBUG語句裏的字符串就不是必須的。調試

經過使用SLF4J,你能夠延遲字符串的建立到運行時刻,這意味着只有在須要字符串的時候才建立它。若是你已經使用了log4j,那麼你已經熟悉把調試語句放入if()條件內的工做場景,而SLF4J佔位符功能比log4j更適合這種場景。日誌

三、如何使用SLF4J和Log4J來作日誌

除了上面所說的好處,我認爲還有個警告須要說一下,爲了使用SLF4J你不只須要進入SLF4J API Jar包,好比slf4j-api-1.6.1.jar,還須要引入協同工做的JAR包,具體是什麼jar包則依賴於後端你使用了什麼日誌工具庫。

假如你想使用SLF4J,還想使用Lo4J,那麼你須要把下列jar包引入到你的classpath中,具體版本要視你使用的SLF4J和log4J版本而定, 好比:

slf4j-api-1.6.1.jar - JAR for SLF4J API

log4j-1.2.16.jar - JAR for Log4J API

slf4j-log4j12-1.6.1.jar - Log4J Adapter for SLF4J

若是你正在使用Maven來管理你的項目依賴,你能夠只引入SLF4J JAR,而後maven會引入它所依賴的其它JAR包。爲了使用Log4J和SLF4J,你能夠在你項目的pom.xml中添加下列依賴:

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

四、一個例子

具體使用哪一種日誌框架,就要提供哪一種日誌框架的配置文件

https://blog.csdn.net/foreverling/article/details/51385128

 http://www.javashuo.com/article/p-spccqfjr-ce.html

相關文章
相關標籤/搜索