Log4j日誌體系結構

2021-07-26 03:46:06 字數 2892 閱讀 6924

我們在寫日誌的時候首先要獲取logger,在每乙個使用log4j的專案都有很多個地方要獲取logger,這些logger是真實的被例項化的logger物件,他們有可能被分散在無數不同的類中,日誌體系結構講的是這些logger物件是如何組織的,他們之間又有什麼樣的關係。

體系結構

我們舉個具體的例項來看看,假設我的專案包結構如下:

說明一下:com.flu.jdk包下面有兩個類分別是logtest1和logtest2,然後在包com.flu包下面有乙個logtest3類,很顯然,com.flu.jdk包是com.flu包的子包。假設我們在這三個類中分別通過logmanager.getlogger(***.class)獲取三個logger例項,他們分別是logger1、logger2和logger3,我們將要討論這三個logger的關係。

值得注意的是log4j的日誌體系中,有乙個特殊的日誌物件叫做root(根),他是始終存在的,假設我們首先獲取logger例項,log4j將構造下面這樣乙個圖形(我不能把它叫做樹):

當只有logger1的時候

當我們獲取logger2例項的時候,這個圖將變成:

當加入logger2日誌例項時結構圖

當我們獲取logger3例項的時候,這個圖又變了乙個樣,如下:

當加入logger3日誌例項之後

僅僅才三個日誌例項,圖就搞的略複雜,可想log4j應用中,將會有無數的日誌例項按照這個規律組成紛繁複雜的有向圖結構,雖然看起來雜亂,但是又規律。那麼問題來了,這樣的結構有什麼用呢?下一節我們將會看到這種結構對於日誌配置繼承的影響。

配置繼承

log4j日誌級別定義

在往下面看之前我們先來看看log4j對日誌級別的定義:

public final static int off_int = integer.max_value;

public final static int fatal_int = 50000;

public final static int error_int = 40000;

public final static int warn_int = 30000;

public final static int info_int = 20000;

public final static int debug_int = 10000;

//public final static int fine_int = debug_int;

public final static int all_int = integer.min_value;

很顯然,log4j的日誌級別有下面的關係:

off > fatal > error > warn > info > debug > all
log4j在寫日誌的時候只有當當前寫日誌的級別大於等於當前日誌例項的配置級別的時候,日誌寫操作才生效,比如當前日誌例項的配置級別為info,那麼log.info會寫成功,而log.debug則不會寫。

日誌寫原始碼剖析

我們來看看一句簡單的log.info("this is log message")的背後,先來看看一段源**:

public void info(object message) 

public boolean isdisabled(int level)

首先看看當前寫的日誌級別是否被禁止的,預設的情況下thresholdint為all,因此info的級別顯然比all大,因此下面會繼續看看info的級別是否大於等於當前日誌例項生效的級別,this.geteffectivelevel()獲取的例項是什麼呢?我們繼續看看**:

public level geteffectivelevel() 

return null; // if reached will cause an nullpointerexception.

}

專案應用

了解log4j的日誌體系結構以及日誌級別配置的繼承特性之後,我們現在應該比較清楚專案中應該如何配置了。以log4j.xml配置檔案為例子,滿足基本需求我們只需要配置root這個日誌例項的日誌級別即可,如下:

上面配置了root日誌例項的日誌級別為info,如果獲取按照一定規範(當前類的許可權定名作為日誌例項名),那麼我們可以保證所有的日誌例項將繼承root所配置的日誌級別。

配置隔離

上面的配置略粗糙,假如我們想為不同的模組給予不同的配置怎麼辦呢?最常見的是業務日誌與中介軟體日誌,比如我們的業務業務包名為com.dianping.biz,而我們的rpc元件的包名字為com.dianping.pigeon,則我們可以使用下面方法給予不同的模組不同的配置:

通過上面的配置,我們可以指定com.dianping.biz包下面所有類獲取的logger都繼承name為com.dianping.biz的日誌配置,而com.dianping.pigeon包下面的所有類獲取的logger都繼承name為com.dianping.pigeon的日誌篇日誌。不過通常設計良好的中介軟體都定製了日誌配置以確保中介軟體日誌與業務日誌隔離。

總結

Log4j日誌體系結構

我們在寫日誌的時候首先要獲取logger,在每乙個使用log4j的專案都有很多個地方要獲取logger,這些logger是真實的被例項化的logger物件,他們有可能被分散在無數不同的類中,日誌體系結構講的是這些logger物件是如何組織的,他們之間又有什麼樣的關係。我們舉個具體的例項來看看,假設我...

log4j日誌系統 Log4j

1.1 log4j的三大核心元件 1.2 loggers 記錄器 1.4 layouts 布局 org.apache.log4j.htmllayout 以html 形式布局 org.apache.log4j.patternlayout 可以靈活地指定布局模式 org.apache.log4j.lay...

log4j記錄不同的日誌 Log4j 日誌記錄方法

logger類具有處理日誌記錄活動的方法。我們可以使用兩個靜態方法建立logger類的例項 public static logger getrootlogger public static logger getlogger string name 第乙個方法返回沒有名稱的根日誌記錄器。第二個方法按名...