log4j是一個通用的log工具。使用log4j的時候我們通常設(shè)置properties文件或者xml文件來進(jìn)行l(wèi)og的配置。
那么log4j對配置文件的加載過程是什么樣的呢?下面以分析log4j的source的形式來進(jìn)行說明。
一,properties文件 當(dāng)用properties文件進(jìn)行配置的時候,對應(yīng)的src為PropertyConfigurator。這個PropertyConfigurator class繼承了接口 Configurator,并實現(xiàn)doConfigure方法。 對properties文件進(jìn)行讀取的過程如下
1,把properties文件的內(nèi)容讀取到Properties對象中保存。 使用方法: Properties props = new Properties(); FileInputStream istream = null; istream = new FileInputStream(configFileName); props.load(istream); istream.close();
2,對讀到的內(nèi)容進(jìn)行解析
2.1進(jìn)行是否輸出內(nèi)部異常信息的判斷 ,通過是否指定參數(shù)“log4j.debug”來判斷
2.2進(jìn)行是否復(fù)位所有配置信息的判斷,通過是否指定參數(shù)“log4j.reset”來判斷
2.3進(jìn)行是否設(shè)定廣域log的level的判斷,通過是否指定參數(shù)“log4j.threshold”來判斷
2.4進(jìn)行RootLogger的設(shè)定
2.4.1 取得RootLogger
2.4.2 取得RootLogger對應(yīng)的Appender
2.4.2.1取得Appender的Layout,將Layout追加到Appender中
//1 設(shè)定Layout的屬性 //2 設(shè)定
Appender的屬性
2.4.3 將Appender追加到RootLogger中
2.5進(jìn)行LoggerFactory的設(shè)定
2.5.1 取得指定參數(shù)“log4j.loggerFactory”的值,并生成Factory類的實例
2.5.2 設(shè)定生成Factory類的實例的屬性
2.6進(jìn)行RootLogger以外其他Logger的設(shè)定
2.6.1取得其他的category
2.6.1.1 設(shè)置category的level屬性
2.6.1.2 取得category對應(yīng)的Appender 取得Appender的Layout,將Layout追加到Appender中 //1 設(shè)定Layout的屬性 //2 設(shè)定Appender的屬性
2.6.1.3 設(shè)置category的是否繼承parent的屬性
2.6.1.4 設(shè)置category的輸出log的渲染類
二,xml文件當(dāng)用xml文件進(jìn)行配置的時候,對應(yīng)的src為DOMConfigurator。這個DOMConfigurator class繼承了接口 Configurator,并實現(xiàn)doConfigure方法。
對xml文件進(jìn)行讀取的過程,與對properties文件進(jìn)行解析的內(nèi)容大致相同.不再重復(fù). 不同點(diǎn)有以下幾個地方
//1 使用DOMAPI讀取xml文件,并從dom中取得各個node的內(nèi)容.
//2 屬性的名稱不一樣