SLF4J簡介與使用(整合log4j)

1、概念
SLF4J的全稱是Simple Logging Facade for Java,即簡單日誌門面。SLF4J並非具體的日誌框架,而是做爲一個簡單門面服務於各種日誌框架,如java.util.logging, logback和log4j。java

SLF4J提供了統一的記錄日誌的接口,對不一樣日誌系統的具體實現進行了抽象化,只要按照其提供的方法記錄便可,最終日誌的格式、記錄級別、輸出方式等經過綁定具體的日誌系統來實現。web

使用SLF4J的好處在於,你只須要按統一的方式寫記錄日誌的代碼,如:apache

public class LoggerTest {

    private static final Logger logger = LoggerFactory.getLogger(Tester.class);

    public static void main(String[] args) {
        logger.info("Current Time: {}", System.currentTimeMillis());
    }
}

SLF4J支持{}做爲佔位符,等價於C語言中的%s,而沒必要再進行字符串的拼接,效率有顯著的提高(見後面運行結果)。api

而無需關心日誌是經過哪一個日誌系統,以什麼風格輸出的。由於它們取決於部署項目時綁定的日誌系統。 
例如,在項目中使用了SLF4J記錄日誌,而且綁定了log4j,則日誌會以log4j的風格輸出;後期須要改成以logback的風格輸出日誌,只須要將log4j替換成logback便可,不用修改項目中的代碼。bash

2、依賴
SLF4J綁定各種日誌框架的原理圖:app

由上圖可知,使用SLF4J依賴於slf4j-api-1.8.0-alpha2.jar,部署時還依賴於要綁定的日誌系統的jar包和相應的適配器jar包。框架

以綁定log4j爲例,須要導入如下包:測試

slf4j-api-1.8.0-alpha2.jar
log4j-1.2.17.jar
slf4j-log4j12-1.8.0-alpha2.jar
若是使用Maven,則只需添加適配器jar包依賴便可:debug

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


3、使用示例
這裏以SLF4J + log4j爲例。日誌

1.在pom.xml中添加依賴(或者手動導入上述3個jar包):

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


2.配置log4j
在類路徑下建立log4j.properties配置文件,這樣log4j會自動加載配置文件。

# rootLogger參數分別爲:根Logger級別,輸出器stdout,輸出器log
log4j.rootLogger = info,stdout,log

# 輸出信息到控制檯
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %rms: %m%n

# 輸出DEBUG級別以上的日誌到D://logs/debug.log
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.DatePattern = '.'yyyy-MM-dd
log4j.appender.log.File = D://debug.log
log4j.appender.log.Encoding = UTF-8
#log4j.appender.log.Threshold = INFO
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n

將log4j.properties放在類路徑下是最簡單的作法,固然也能夠經過PropertyConfigurator在代碼中加載或者經過web.xml加載。3.測試代碼

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

public class LoggerTest {

    private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    public static void main(String[] args) {
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.info("Current Time: " + System.currentTimeMillis());
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.trace("trace log");
        logger.warn("warn log");
        logger.debug("debug log");
        logger.info("info log");
        logger.error("error log");
    }
}

4.運行結果

2017-06-16 23:11:05,490 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:14) 0ms: Current Time: 1497625865488
2017-06-16 23:11:05,493 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:15) 3ms: Current Time: 1497625865493
2017-06-16 23:11:05,493 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:16) 3ms: Current Time: 1497625865493
2017-06-16 23:11:05,495 [WARN ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:18) 5ms: warn log
2017-06-16 23:11:05,495 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:20) 5ms: info log
2017-06-16 23:11:05,495 [ERROR] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:21) 5ms: error log

一般輸出日誌開銷很是大,從上述結果可見,SLF4J經過{}做爲佔位符的方式輸出字符串,相比字符串拼接的方式,效率有顯著的提高。

5.更換日誌系統
看到這裏,你可能會有疑問:既然都用了log4j,爲何還要用SLF4J來寫記錄日誌的代碼呢,不是畫蛇添足嗎?

答案是否認的。假設咱們再也不須要log4j,而是但願改成使用java自帶logging記錄日誌,咱們須要作的僅僅是將pom.xml的依賴項slf4j-log4j12改成slf4j-jdk14便可,無需對上述測試代碼作任何修改。

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

是的,就是這麼簡單。再次運行測試代碼:

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550843
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550874
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550875
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
警告: warn log
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: info log
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
嚴重: error log

咱們發現,此時日誌已經變爲以logging的方式輸出。

4、總結
SLF4J的使用很是簡單,甚至連官網上都說鑑於它過輕量,文檔篇幅不長。

Given the small size of SLF4J, its documentation is not very lengthy.

在《阿里巴巴Java開發手冊(正式版)》中,日誌規約一項第一條就強制要求使用SLF4J:

1.【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的API,而應依賴使用日誌框架SLF4J中的API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。

因此從如今開始使用SLF4J吧!

相關文章
相關標籤/搜索