commons-logging
1.使用commons-logging.properties指定Log實現類
Logger.getLogger()和LogFactory.getLog()的區別
參考資料
commons-logging的使用簡介:https://blog.csdn.net/backbug/article/details/78655664
官方文檔:https://commons.apache.org/proper/commons-logging/guide.html
Logger.getLogger()和LogFactory.getLog()的區別:https://blog.csdn.net/z1616595/article/details/103706355
前言
上篇講過Log4j入門使用,這次就來介紹一下經常會伴隨它一起出現的另一個jar包commons-logging。我在平常的工作和學習中,經常會看到Logger和LogFactory出現,乍一看他們好像是去獲取日誌,這不禁讓我有疑問,這倆貨到底有啥區別,從這個疑問,我開始了對commons-logging的探索和學習。
概述
Jakarta Commons-logging(JCL)是apache提供的日誌接口,提供了日誌的簡單實現和日誌解耦功能。所謂解耦功能,就是開發者在開發時可以通過使用commons-logging,不指定具體的日誌實現類,完成開發。日誌具體使用類在運行時纔會通過配置加載,從而實現日誌解耦。
commons-logging對衆多logging(如Log4j或其他日誌包)實現類進行封裝,使用者可以通過Log接口使用日誌功能,無需理會具體的日誌實現細節。另外提供接口Log供開發者自定義logging。
實現原理
JCL有兩個基本的抽象類:Log(接口)和LogFactory(抽象類),Log是日誌基礎接口,所有commons-logging日誌類都要實現該接口,LogFactory是用於生成Log的工廠類。默認的LogFactory採用以下順序來決定使用哪個Log實現類(當第一個Log匹配時,停止查找):
1.查找命名爲org.apache.commons.logging.Log的配置屬性,屬性值爲類名,可以使用java代碼手動注入,不過一般使用更爲方便的資源文件commons-logging.properties配置。在classpath下查找commons-logging.properties文件,找到則使用其定義的Log實現類,當有多個文件時,根據優先級使用第一個查找到的。
2.查找命名爲org.apache.commons.logging.Log的系統屬性。
3.如果classpath中有Log4J包,則使用相應的封裝類Log4JLogger。
4.如果應用是基於JDK1.4以上的版本實現的,則使用相應的封裝類Jdk14Logger。
5.使用默認簡單的日誌封裝類SimpleLog。
使用
1.使用commons-logging.properties指定Log實現類
首先,通過maven引入依賴,或者直接將jar包添加至lib下。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
新建commons-logging.properties文件,放在classpath下指定SimpleLog爲Log實現類。
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
代碼中使用commons-logging。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CLASS {
private Log log = LogFactory.getLog(CLASS.class);
public static void main(String[] args) {
log.debug("DEBUG ...");
log.info("INFO ...");
log.error("ERROR ...");
}
}
2.使用log4j配合commons-logging
首先,通過maven引入依賴,或者直接將jar包添加至lib下。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j<artifactId>
<version>1.2.17</version>
</dependency>
配置簡單的log4j配置,添加log4j.properties配置文件到classpath下:
log4j.rootLogger=DEBUG,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] [%p] - %m%n
這裏不需要再配置commons-logging.properties,只需配置log4j.properties配置,實現log4j即可。然後在使用日誌功能時,會LogFactory根據默認的查找機制,自動匹配Log4J,使用Log實現類org.apache.commons.logging.impl.Log4JLogger。
代碼中使用commons-logging,我們可以看到在引入依賴時候並沒有使用到log4j的相關包,這裏就是通過commons-logging對日誌具體的實現進行封裝。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CLASS {
private Log log = LogFactory.getLog(CLASS.class);
public static void main(String[] args) {
log.debug("DEBUG ...");
log.info("INFO ...");
log.error("ERROR ...");
}
}
觀察控制檯即可得到輸出信息。
2019-12-25 21:49:46,334 [main] [DEBUG] - DEBUG ...
2019-12-25 21:49:46,335 [main] [INFO] - INFO ...
2019-12-25 21:49:46,335 [main] [ERROR] - ERROR ...
commons-logging Q&A
本節主要就我在使用commons-logging時候的疑問進行解答,也分享給大家。
Logger.getLogger()和LogFactory.getLog()的區別
這是一個我剛接觸commons-logging的疑問,也可能是很多初學者的問題。
Logger是Log4j的一個工具類,我們在開發過程中,可以通過使用Logger來使用Log4j;LogFactory是commons-logging的工廠類,用來獲取日誌實現類Log,LogFactory具體使用哪個Log,在運行時方纔進行加載。
總結一下,第一點時jar包的不通,就是Logger是Log4j的日誌類,而LogFactory是commons-logging的工廠類。第二點是使用時的差異,當我們使用Logger時,我們在開發時就知道使用的日誌實現時Log4j,而當我們使用commons-logging時,只有在運行時,我們才能知道使用的日誌實現類時什麼。
最後兩者的作用其實是相同的,都是用來生成日誌類,不過第一個Logger.getLogger()是得到的是org.apache.log4j.Logger,第二個LogFactory.getLog()得到的是org.apache.commons.logging.Log的實現類。
總結
本來還有一個LogFactory.getLog()的兩種用法要寫在Q&A中,但是寫完之後發現自己在這個對這個問題的回答應該是個不及格,爲了不給大家一個錯誤的引導,我就沒寫了。有興趣的小夥伴可以自行深入學習哦!雖然我使用過commons-logging,也研究過其配置加載順序,但也只是侷限於此,知其然不知其所以然,深入一點的東西就兩眼一閉了。當我日常工作和學習中,每每遇到一些沒有接觸過的知識點想去查資料時,發現查出來的資料又有其他更深入的東西,如同俄羅斯套娃一般,但因爲時間不足,就放棄了,真正想要整理時,又發現無從下筆,真是書到用時方恨少呀。在這給自己定一個小目標,希望接下來熟悉掌握日誌的使用和原理,然後寫一篇更深入的文章,不敢說精通,但求熟悉。