java 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包依賴即可:
org.slf4j
slf4j-log4j12
1.8.0-alpha2
三、使用示例
這里以SLF4J + log4j為例。
1.在pom.xml中添加依賴(或者手動導入上述3個jar包):
org.slf4j
slf4j-log4j12
1.8.0-alpha2
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即可,無需對上述測試代碼做任何修改。
org.slf4j
slf4j-jdk14
1.8.0-alpha2
是的,就是這么簡單。再次運行測試代碼:
六月 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的使用非常簡單,甚至連官網上都說鑒于它太輕量,文檔篇幅不長。
Given the small size of SLF4J, its documentation is not very lengthy.
在《阿里巴巴Java開發手冊(正式版)》中,日志規約一項第一條就強制要求使用SLF4J:
1.【強制】應用中不可直接使用日志系統(Log4j、Logback)中的API,而應依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于維護和各個類的日志處理方式統一。
所以從現在開始使用SLF4J吧!
總結
以上是生活随笔為你收集整理的java log4j权限被否定_SLF4J简介与使用(整合log4j)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的unique_MySQL使用
- 下一篇: 192.168.8.1手机登陆_高端机型