1、根據環境變量env設置
<- 可以根據System.getenv("LogHomeRoot")獲取的環境變量,可以直接通過以下方式設置 ->
<property name="LOG_HOME">${env:LogHomeRoot}</property>
2、根據系統屬性sys設置
<- 可以根據System.getProperty("LogHomeRoot")獲取的系統屬性,可以直接通過以下方式設置 ->
<property name="LOG_HOME">${sys:LogHomeRoot}</property>
3、通過監聽設置系統屬性實現
1> 編寫監聽類
ServletContextListener:當Servlet容器啓動或終止Web應用時觸發。
public class Log4j2ContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent arg0) {
String LogHomeRoot = "/data/logs/test";
System.setProperty("LogHomeRoot", LogHomeRoot);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.getProperties().remove("LogHomeRoot");
}
}
2> web.xml配置監聽
配在ContextLoaderListener前面。儘可能配在前面,避免其他地方需要處理日誌寫入,但日誌路徑不完整。
<listener>
<listener-class>com.test.Log4j2ContextListener</listener-class>
</listener>
3> log4j2.xml
<property name="LOG_HOME">${sys:LogHomeRoot}</property>
這樣,tomcat啓動後,spring加載之前設置好系統屬性,加載log4j2時就可以取到動態變量值了。
順便記錄一下Eclipse設置Tomcat啓動時參數:
Servers窗口tomcat雙擊打開,點擊 Open launch configuration,打開設置頁面,或者:
Run -> Run Configurations -> 選中Tomcat Server:
Arguments 標籤 VM arguments 用於設置系統屬性,比如:-DLogHomeRoot="/data/logs/test",多個參數之間空格分隔
Environment 標籤 New 用於設置環境變量