Log4j 2.0在開發中的高階使用詳解—讀取配置檔案(六)

業餘草發表於2014-09-01

log4j中配置日誌檔案存放的位置不一定在src下面,即根目錄下。這個時候我們需要解決如何載入配置檔案的問題。在log4j1.x中解決的方法就比較多了。如:PropertyConfigurator.configure();和DOMConfigurator.configure ();這兩種方法讀取。而在log4j2.x當中,這兩個類都已經不存在了。這個時候我們該如何去載入配置檔案呢?

答案也很簡單,就是log4j2.x的版本給我提供了ConfigurationSource和Configurator這兩個類。我們可以使用它們進行手動的載入任意位置的配置檔案資訊。

我就主要介紹三種方法:log4j 2讀取配置檔案的三種方法。

log4j 2讀取的配置檔案可以分為三類:src下的配置檔案、絕對路徑的配置檔案、相對路徑的配置檔案。我們一一給例子。直接看程式碼:

package com.herman.test;

import java.io.File;
import java.io.FileInputStream;
import java.net.URL;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;

public class ConfigTest {
	
	private static Logger logger = LogManager.getLogger(ConfigTest.class);
	/**
	 * log4j 2讀取配置檔案
	 * log4j 2讀取的配置檔案可以分為三類:src下的配置檔案、絕對路徑的配置檔案、相對路徑的配置檔案
	 */
	
	//第一類  載入src下的配置檔案
	public static void test0(){
		//src下的配置檔案會預設的被log4j的框架載入,我們就不顯示的載入了
		//直接測試
		logger.info("我列印了.......");
		//輸出內容
		//2014-09-01 15:49:30,229 INFO  [main] test.ConfigTest (ConfigTest.java:18) - 我列印了.......
	}
	
	//第二類  絕對路徑的配置檔案
	public static void test1(){
		//我們將log4j2.xml放在D盤下
		//這是需要手動的載入
		//絕對路徑配置檔案		
		ConfigurationSource source;
		try {
			//方法1  使用  public ConfigurationSource(InputStream stream) throws IOException 建構函式
			source = new ConfigurationSource(new FileInputStream("D:\\log4j2.xml"));
			
			//方法2 使用 public ConfigurationSource(InputStream stream, File file)建構函式
			File config=new File("D:\\log4j2.xml");
			source = new ConfigurationSource(new FileInputStream(config),config);
			
			//方法3 使用 public ConfigurationSource(InputStream stream, URL url) 建構函式
			String path="D:\\log4j2.xml";
			source = new ConfigurationSource(new FileInputStream(path),new File(path).toURL());
			
			//source.setFile(new File("D:\log4j2.xml"));		
			//source.setInputStream(new FileInputStream("D:\log4j2.xml"));		
			Configurator.initialize(null, source);				
			Logger logger = LogManager.getLogger(ConfigTest.class.getName()); 		
			logger.trace("trace...");		
			logger.debug("debug...");		
			logger.info("info...");		
			logger.warn("warn...");		
			logger.error("error...");		
			logger.fatal("fatal...");
			//一下是執行效果
			/*2014-09-01 16:03:07,331 DEBUG [main] test.ConfigTest (ConfigTest.java:42) - debug...
			2014-09-01 16:03:07,331 INFO  [main] test.ConfigTest (ConfigTest.java:43) - info...
			2014-09-01 16:03:07,331 WARN  [main] test.ConfigTest (ConfigTest.java:44) - warn...
			2014-09-01 16:03:07,331 ERROR [main] test.ConfigTest (ConfigTest.java:45) - error...
			2014-09-01 16:03:07,331 FATAL [main] test.ConfigTest (ConfigTest.java:46) - fatal...*/
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
	
	//第三類  相對路徑的配置檔案載入
	public static void test2(){
		//這裡需要注意路徑中不要出現中文和空格,如果存在中文,請使用url轉碼
		ConfigurationSource source;
		try {
			//方法1  使用getResource()
			String path="/com/herman/config/log4j2.xml";
			URL url=ConfigTest.class.getResource(path);
			source = new ConfigurationSource(new FileInputStream(new File(url.getPath())),url);
			Configurator.initialize(null, source);	
			
			//方法2 使用System.getProperty
			String config=System.getProperty("user.dir");
			source = new ConfigurationSource(new FileInputStream(config+"\\src\\com\\herman\\config\\log4j2.xml"));
			Configurator.initialize(null, source);
			
			//輸出內容
			/*2014-09-01 16:32:19,746 DEBUG [main] test.ConfigTest (ConfigTest.java:53) - debug...
			2014-09-01 16:32:19,746 INFO  [main] test.ConfigTest (ConfigTest.java:54) - info...
			2014-09-01 16:32:19,746 WARN  [main] test.ConfigTest (ConfigTest.java:55) - warn...
			2014-09-01 16:32:19,746 ERROR [main] test.ConfigTest (ConfigTest.java:56) - error...
			2014-09-01 16:32:19,746 FATAL [main] test.ConfigTest (ConfigTest.java:57) - fatal...*/
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//test0();
		//test1();
		test2();
	}
}

很簡單吧!歡迎大家關注我的個人部落格!!!!

如有不懂,疑問或者欠妥的地方,請加QQ群:135430763   進行反饋,共同學習!

相關文章