slf4j学习笔记
1、 slf4j與其余日志框架的區別和聯系
幾個有名的Java日志框架:
- log4j
- commons-logging
- jdk-logging
- slf4j
- logback
- log4j2
上面幾個日志框架簡單分為兩類: - 日志門面 commons-logging,slf4j
- 日志實現 log4j,jdk-logging,logback,log4j2
所謂的日志門面就是為各種loging APIs提供一個簡單統一的接口,從而使得最終用戶能夠在部署的時候配置自己希望的loging APIs實現。
slf4j僅僅是一個為Java程序提供日志輸出的統一接口,并不是一個具體的日志實現方案,就比如JDBC一樣,只是一種規則而已,所以單獨的slf4j是不能工作的,必須搭配其他具體的日志實現方案,比如log4j或者log4j2,要在系統中使用slf4j,我們需要引入的核心包為:slf4j-api-1.6.4.jar。
如果不想每次都寫private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以在方法前用注解@Slf4j,然后直接使用log.info去打印日志。如果注解@Slf4j注入后找不到變量log,那就給IDE安裝lombok插件(idea中:1、File → settings → Plugins, 然后點擊“Browse repositories”;2、輸入 lombok 搜索插件, 點install安裝,安裝完重啟idea)。
2、Hello World
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>yuan</groupId><artifactId>slf4j_01</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency></dependencies> </project>新建log4j.properties,位于resourses目錄下
log4j.rootLogger=ERROR,console,filelog4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%m%nlog4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=d:/test.log log4j.appender.file.DatePattern='_'yyyyMMdd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} %p %c (%L) -%m %n#設置指定包的level等級(rootLogger代表所有),但是不能再指定appender,否則每個appender會打印兩次 log4j.logger.org.smart4j=DEBUG測試類PropsUtil :
import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.IOException;public class PropsUtil {private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);public static void main(String[] args) throws IOException {/*測試日志*/LOGGER.error("Hello World");} }執行結果:
3、注解方式使用slf4j
如果不想每次都寫private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以在方法前用注解@Slf4j,然后直接使用log.info去打印日志。如果注解@Slf4j注入后找不到變量log,那就給IDE安裝lombok插件(idea中:1、File → settings → Plugins, 然后點擊“Browse repositories”;2、輸入 lombok 搜索插件, 點install安裝,安裝完重啟idea)。
對上面的Hello World例子進行如下修改:
pom.xml中添加lombok依賴:
測試類PropsUtil改為:
import lombok.extern.slf4j.Slf4j;import java.io.IOException; @Slf4j public class PropsUtil { // private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);public static void main(String[] args) throws IOException {/*測試日志*/ // LOGGER.error("Hello World");log.error("Hello World");} }在類前面使用@Slf4j注解后為該類自動生成log日志對象,執行可以看到與剛才相同的效果。
4、日志系統橋接器
這部分由于時間關系沒有全部驗證,先記錄于此。
日志系統橋接器說白了就是一種偷天換日的解決方案。
比如log4j-over-slf4j,即log4j -> slf4j的橋接器,這個庫定義了與log4j一致的接口(包名、類名、方法簽名均一致),但是接口的實現卻是對slf4j日志接口的包裝,即間接調用了slf4j日志接口,實現了對日志的轉發。
slf4j+log4j
如果我們在系統中需要使用slf4j和log4j來進行日志輸出的話,我們需要引入下面的橋接jar包:
log4j核心jar包:log4j-1.2.17.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j與log4j的橋接包:slf4j-log4j12-1.6.1.jar,這個包的作用就是使用slf4j的api,但是底層實現是基于log4j.
slf4j+log4j2
如果我們在系統中需要使用slf4j和log4j2來進行日志輸出的話,我們需要引入下面的jar包:
log4j2核心jar包:log4j-api-2.7.jar和log4j-core-2.7.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j與log4j2的橋接包:log4j-slf4j-impl-2.7.jar,這個包的作用就是使用slf4j的api,但是底層實現是基于log4j2.
slf4j+log4j不修改代碼升級到log4j2
如果我們系統中剛開始用的是slf4j和log4j,然后出于性能考慮,要升級到slf4j和log4j2,并且不需要改動任何代碼的話(因為我們系統可能是一個大工程,然后基本上每個類都會有日志輸出,改動代碼可能牽一發而動全身),出于這個考慮,我們可以這樣來進行修改(修改依賴):
1、刪除項目中存在的Log4j1.x所必須的log4j和slf4j-log4j12等依賴,例如從我們上面做的去升級的話,需要刪除log4j-1.2.17.jar和slf4j-log4j12-1.6.1.jar
2、添加log4j2和slf4j橋接包:log4j-slf4j-impl-2.7.jar替換log4j和slf4j橋接包:slf4j-log4j12-1.6.1.jar
3、如果我們在系統中使用了log4j的api去獲取Logger的話:
我們需要添加log4j-1.2-api-2.7.jar去替換log4j-1.2.17.jar
4、將log4j的properties文件修改為log4j2的xml文件
然后,同樣在系統中使用slf4j的方式獲取日志:
總結
- 上一篇: harmonyos鸿蒙,鸿蒙Harmon
- 下一篇: 阿里巴巴的大物流计划