為什么使用SLF4J比使用log4j或者java.util.logging更好


1、SLF4j是什么?

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

如果你正在編寫內部或者外部使用的API或者應用庫的話,如果使用了slf4j,那么你不需要讓使用你所編寫的庫的客戶端去選擇日志庫。

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

日志記錄庫的抽象理念不是新的,而且Apache的commons logging日志記錄庫也是用了這個理念,不過現在SLF4J很快就會成為Java世界里標准的日志記錄庫。 

2、Why使用SLF4J,也不願使用Log4J,logback和java.util.Logging

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

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

占位符功能與 String的format()方法中 的%s非常相似,因為它在運行時刻才提取所提供的真正的字符串。這不僅縮減了代碼中的許多字符串連接,而且減少了創建String對象所需要的資源。

即便在你生產環境日志級別比如DEBUG和INFO級別的字符串連接可能不需要的時候,仍然可以起到同樣的效果。

由於 字符串是不可更改的 ,而且它們是在字符串池中創建的,這些字符串使用了 堆內存 ,當應用在生產環境中運行在ERROR級別的時候,字符串在大多數情況下就不是必須的,比如DEBUG語句里的字符串就不是必須的。

通過使用SLF4J,你可以延遲字符串的創建到運行時刻,這意味着只有在需要字符串的時候才創建它。如果你已經使用了log4j,那么你已經熟悉把調試語句放入if()條件內的工作場景,而SLF4J占位符功能比log4j更適合這種場景。

3、如何使用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>

4、一個例子

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

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

 https://blog.csdn.net/qq_36330643/article/details/71250465


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM