log4j2的進階文件。主要寫其中網上沒什麼資料,比較實用的幾個地方。
阿新 • • 發佈:2019-01-29
這是一篇log4j2的進階文件。在這裡面我就不再說基礎的使用配置了,如果還沒對log4j2有了解,請自行學習後再檢視我這篇文件。
我只列出我在使用之中摸索到的然而網上沒什麼資料的一些地方。
一、生成的日誌檔案如何指定在專案目錄?
之前使用過logback框架的時候我是通過 “System.setProperty("logdir", realPath);”,然後在配置文件中通過${logdir}的方式引用的。 但是在log4j2中稍微改變了一下,設定方式是一樣的:System.setProperty("logdir", realPath);,但是引用方式卻改成:${sys:logdir}了。二、如何手動載入配置檔案
建議在web.xml配置一個listener: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]檔案失敗!"); } }
<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的呼叫方法就可以維持不變了。
寫這篇文章主要是因為網上這方面的資料不太多,特別是第三點,有的部落格居然指出只能一一改程式碼。
汗,最後在官網上看到可以使用這個包。這篇文章大概就寫到這裡了。如果文章裡面有什麼錯漏,歡迎指出。