1. 程式人生 > >slf4j的簡單用法以及與log4j的區別

slf4j的簡單用法以及與log4j的區別

target 表示 import 再看 配置 slf4 需要 很大的 col

之前在項目中用的日誌記錄器都是log4j的日誌記錄器,可是到了新公司發現都是slf4j,於是想著研究一下slf4j的用法。

1 基本介紹

  SLF4J不同於其他日誌類庫,與其它日誌類庫有很大的不同。SLF4J(Simple logging Facade for Java)不是一個真正的日誌實現,而是一個抽象層( abstraction layer),它允許你在後臺使用任意一個日誌類庫。如果是在編寫供內外部都可以使用的API或者通用類庫,那麽你真不會希望使用你類庫的客戶端必須使用你選擇的日誌類庫。

  如果一個項目已經使用了log4j,而你加載了一個類庫,比方說 Apache Active MQ——它依賴於於另外一個日誌類庫logback,那麽你就需要把它也加載進去。但如果Apache Active MQ使用了SLF4J,你可以繼續使用你的日誌類庫而無需忍受加載和維護一個新的日誌框架的痛苦。

  總的來說,SLF4J使你的代碼獨立於任意一個特定的日誌API,這是對於API開發者的很好的思想。雖然抽象日誌類庫的思想已經不是新鮮的事物,而且Apache commons logging也已經在使用這種思想了,但SLF4J正迅速成為Java世界的日誌標準。讓我們再看幾個使用SLF4J而不是log4j、logback或者java.util.logging的理由。

2 SLF4J對比Log4J,logback和java.util.Logging的優勢

正如我之前說的,在你的代碼中使用SLF4J寫日誌語句的主要出發點是使得你的程序獨立於任何特定的日誌類庫,依賴於特定類庫可能需要使用不同於你已有的配置,並且導致更多維護的麻煩。除此之外,還有一個SLF4J API的特性是使得我堅持使用SLF4J而拋棄我長期間鐘愛的Log4j的理由,是被稱為占位符(place holder),在代碼中表示為“{}

”的特性。占位符是一個非常類似於在Stringformat()方法中的%s,因為它會在運行時被某個提供的實際字符串所替換。這不僅降低了你代碼中字符串連接次數,而且還節省了新建的String對象。通過使用SLF4J,你可以在運行時延遲字符串的建立,這意味著只有需要的String對象才被建立。而如果你已經使用log4j,那麽你已經對於在if條件中使用debug語句這種變通方案十分熟悉了,但SLF4J的占位符就比這個好用得多。

3.slf4j的簡單用法

package test2;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(Slf4jTest.class);// slf4j日誌記錄器 // 普通的日誌記錄 logger.debug("普通的日誌記錄"); // {}占位符記錄日誌 for (int i = 0; i < 3; i++) { logger.debug("這是第{}條記錄", i); } // 用\轉義{} logger.debug("Set \\{} differs from {}", "3"); // output:Set {} differs // from 3 // 兩個參數 logger.debug("兩個占位符,可以傳兩個參數{}----{}", 1, 2); } }

結果:

20:24:46,368 DEBUG Slf4jTest:12 - 普通的日誌記錄
20:24:46,371 DEBUG Slf4jTest:16 - 這是第0條記錄
20:24:46,371 DEBUG Slf4jTest:16 - 這是第1條記錄
20:24:46,371 DEBUG Slf4jTest:16 - 這是第2條記錄
20:24:46,371 DEBUG Slf4jTest:20 - Set {} differs from 3
20:24:46,371 DEBUG Slf4jTest:24 - 兩個占位符,可以傳兩個參數1----2

至於詳細的日誌級別的介紹參考我的另一篇博客:http://www.cnblogs.com/qlqwjy/p/7192947.html

slf4j的簡單用法以及與log4j的區別