SLF4J簡介與使用(整合log4j)
一、概念
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即可,不用修改項目中的代碼。
二、依賴
SLF4J綁定各類日志框架的原理圖:
由上圖可知,使用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包依賴即可
三、使用示例
這里以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.運行結果
2018-09-01 23:14:32,690 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:11) 2ms: Current Time: 1535814872683
2018-09-01 23:14:32,700 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:12) 12ms: Current Time: 1535814872700
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:13) 13ms: Current Time: 1535814872701
2018-09-01 23:14:32,701 [WARN ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:15) 13ms: warn log
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:17) 13ms: info log
2018-09-01 23:14:32,701 [ERROR] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:18) 13ms: 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>
是的,就是這么簡單。再次運行測試代碼:
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535309
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535475
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535477
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
警告: warn log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: info log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
嚴重: error log
我們發現,此時日志已經變為以logging的方式輸出。
四、總結
SLF4J的使用非常簡單,甚至連官網上都說鑒于它太輕量,文檔篇幅不長。
Given the small size of SLF4J, its documentation is not very lengthy.
在《阿里巴巴Java開發手冊(正式版)》中,日志規約一項第一條就強制要求使用SLF4J:
【強制】應用中不可直接使用日志系統(Log4j、Logback)中的API,而應依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于維護和各個類的日志處理方式統一。
所以從現在開始使用SLF4J吧!
引用
來源處
官方文檔