1. 程式人生 > >log4j2的進階文件。主要寫其中網上沒什麼資料,比較實用的幾個地方。

log4j2的進階文件。主要寫其中網上沒什麼資料,比較實用的幾個地方。

這是一篇log4j2的進階文件。在這裡面我就不再說基礎的使用配置了,如果還沒對log4j2有了解,請自行學習後再檢視我這篇文件。

我只列出我在使用之中摸索到的然而網上沒什麼資料的一些地方。

一、生成的日誌檔案如何指定在專案目錄?

之前使用過logback框架的時候我是通過 “System.setProperty("logdir", realPath);”,然後在配置文件中通過${logdir}的方式引用的。 但是在log4j2中稍微改變了一下,設定方式是一樣的:System.setProperty("logdir", realPath);,但是引用方式卻改成:${sys:logdir}了。

二、如何手動載入配置檔案

對log4j2有了解的人都應該清楚,log4j2的配置檔案log4j2.xml、log4j.json等等(還有幾種命名方式)存放在classpath目錄都會自動載入。 這裡介紹一種程式碼手動載入的方法:
        File file = new File(realPath+"static//data//log4j2.xml");  
		 try {
		     LoggerContext context =(LoggerContext)LogManager.getContext(false);
		     context.setConfigLocation(file.toURI());
		     //重新初始化Log4j2的配置上下文
		     context.reconfigure();
		   }catch(Exception e){
			   System.out.println("[SYSTEM]==> Log4j2 初始化失敗,讀取[log4j2]檔案失敗!");
		   }
	}
建議在web.xml配置一個listener:
<listener>
		<listener-class>com.toby.servlet.ServletInitListener</listener-class>
	</listener> 

然後在這個listener裡面載入,記得第一點的System.setProperty("logdir", realPath);要在第二點之前設定。

當使用第一點設定目錄的方法的話,我建議配置檔案手動載入比較好。因為我試過配置檔案放在預設位置的時候,可能是預設順序的問題,有時會出現${sys:logdir}未設定到。 貼上我的ServletInitListener的程式碼吧。
public class ServletInitListener implements ServletContextListener{
	
	public void contextDestroyed(ServletContextEvent event) {
		System.getProperties().remove("logdir");
	}

	public void contextInitialized(ServletContextEvent event) {
		System.setProperty("logdir", event.getServletContext().getRealPath("/"));
		initLog4j(event.getServletContext().getRealPath("/"));
	}

	private void initLog4j(String realPath) {
		File file = new File(realPath+"static//data//log4j2.xml");
		 try {
		     LoggerContext context =(LoggerContext)LogManager.getContext(false);
		     context.setConfigLocation(file.toURI());
		     //重新初始化Log4j2的配置上下文
		     context.reconfigure();
		   }catch(Exception e){
			   System.out.println("[SYSTEM]==> Log4j2 初始化失敗,讀取[log4j2]檔案失敗!");
		   }
	}

}

三、我以前使用log4j1,如何遷移至log4j2

如果我們以前使用log4j1的時候,並沒有使用slf4j或者用了但是沒有通過slf4j的api呼叫日誌。 我們獲得日誌的方法是:private static Logger log = Logger.getLogger(TestController.class); 但是log4j2獲得日誌的方法是:private static Logger log = LogManager.getLogger(TestController.class); 然而我們又沒有去封裝使用,難道就要每一個地方去修改了嗎?這顯然是不可能的,封裝的太多類裡面用了日誌了。 其實很簡單,我們只需要引入一個jar包,因為我用的是maven,所以我直接提供他的依賴,沒用的朋友可以自行去下載jar包。
	<!-- 我用的是2.5版本的 -->
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-1.2-api</artifactId>
		<version>2.5</version>
	</dependency>
只要加了這個包,之前log4j1的呼叫方法就可以維持不變了。 寫這篇文章主要是因為網上這方面的資料不太多,特別是第三點,有的部落格居然指出只能一一改程式碼。 汗,最後在官網上看到可以使用這個包。
這篇文章大概就寫到這裡了。如果文章裡面有什麼錯漏,歡迎指出。