slf4j 和 log4j合用的(Maven)配置

一、概念

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

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

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

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,而不必再進行字符串的拼接,效率有顯著的提升(見後面運行結果)。

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

二、步驟

1. 在Maven的porn.xml 文件中添加dependency如下(也可手動引入下述的三個包)

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

之後就會添加三個包  slf4j-api-1.6.1.jar、slf4j-log4j12-1.7.2.jar、log4j-1.2.17.jar

2. 之後在項目下添加log4j.properties

 #config root logger  
 log4j.rootLogger = INFO,system.out  
 log4j.appender.system.out=org.apache.log4j.ConsoleAppender  
 log4j.appender.system.out.layout=org.apache.log4j.PatternLayout  
 log4j.appender.system.out.layout.ConversionPattern=MINAServer Logger-->%5p{%F:%L}-%m%n  
   
 #config this Project.file logger  
 log4j.logger.thisProject.file=INFO,thisProject.file.out  
 log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender  
 log4j.appender.thisProject.file.out.File=logContentFile.log  
 log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout

 

3. 在代碼中添加

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

 

如果要輸出到文件系統

1 log4j.rootLogger=INFO,R,stdout    
 2     
 3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender    
 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
 5 log4j.appender.stdout.layout.ConversionPattern=Logger-->%5p{%F:%L}-%m%n   
 6     
 7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender    
 8 log4j.appender.R.File=../logs/log  
 9 log4j.appender.R.layout=org.apache.log4j.PatternLayout  
10 log4j.appender.R.layout.ConversionPattern=Logger-->%5p{%F:%L}-%m%n

每天產生一個log的配置方法:

log4j.rootLogger=DEBUG,DAILY_FILE
log4j.appender.DAILY_FILE=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.DAILY_FILE.file=${user.home}/logs/logging.log4j
log4j.appender.DAILY_FILE.DatePattern='_'yyyy-MM-dd'.log' 
log4j.appender.DAILY_FILE.ImmediateFlush=true
log4j.appender.DAILY_FILE.Append=true
log4j.appender.DAILY_FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DAILY_FILE.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

三、更換日誌系統

看到這裏,你可能會有疑問:既然都用了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的方式輸出。

四、總結

SLF4J的使用非常簡單,甚至連官網上都說鑑於它太輕量,文檔篇幅不長。

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

所以從現在開始使用SLF4J吧!

 

本文示例源代碼項目地址:https://gitee.com/fairy1674/Demo-Project/tree/master/mvn-test 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章