SLF4J简介与使用(整合log4j)
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吧!
引用
來源處
官方文檔
總結
以上是生活随笔為你收集整理的SLF4J简介与使用(整合log4j)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Kali Linux中下载工具Steg
- 下一篇: 计算机分php,计算机按照处理数据的形态