commons-logging使用

commons-logging

參考資料

前言

概述

實現原理

使用

1.使用commons-logging.properties指定Log實現類

2.使用log4j配合commons-logging

common-logging Q&A

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,也研究過其配置加載順序,但也只是侷限於此,知其然不知其所以然,深入一點的東西就兩眼一閉了。當我日常工作和學習中,每每遇到一些沒有接觸過的知識點想去查資料時,發現查出來的資料又有其他更深入的東西,如同俄羅斯套娃一般,但因爲時間不足,就放棄了,真正想要整理時,又發現無從下筆,真是書到用時方恨少呀。在這給自己定一個小目標,希望接下來熟悉掌握日誌的使用和原理,然後寫一篇更深入的文章,不敢說精通,但求熟悉。

發佈了5 篇原創文章 · 獲贊 4 · 訪問量 4622
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章