1. 程式人生 > >web專案Log4j日誌輸出路徑配置問題 問題描述:一個web專案想在一個tomcat下執行多個例項(通過修改war包名稱的實現),然後每個例項都將日誌輸出到tomcat的logs目錄下例項名命名的文

web專案Log4j日誌輸出路徑配置問題 問題描述:一個web專案想在一個tomcat下執行多個例項(通過修改war包名稱的實現),然後每個例項都將日誌輸出到tomcat的logs目錄下例項名命名的文

問題描述:一個web專案想在一個tomcat下執行多個例項(通過修改war包名稱的實現),然後每個例項都將日誌輸出到tomcat的logs目錄下例項名命名的資料夾下進行區分檢視每個例項日誌,要求通過儘可能少的改動配置檔案,最好修改例項名後可以不修改log4j的配置檔案。 實現分析:一般實現上面需求,需要在修改完war包名稱之外要再做下面配置: 1、修改每個例項名下web.xml中引數webAppRootKey為不同值。同一個tomcat下執行多個web應用時,該值相同的話,執行時會拋異常。 <context-param> <param-name>webAppRootKey</param-name> <param-value>webApp.root</param-value> </context-param> 2、log4j配置檔案日誌輸出路徑修改  log4j配置檔案中路徑配置一般有三種方法:
(1)絕對路徑法:直接配置為系統覺得路徑; (2)相對路徑法: log4j.appender.logfile.File=../logs/app.log,將日誌記錄到tomcat下的logs資料夾; log4j.appender.logfile.File=logs/app.log,將日誌記錄到tomcat的bin目錄下的logs資料夾; (3)使用環境變數相對路徑法:程式會優先找jvm環境變數,然後再找系統環境變數,來查詢配置檔案中的變數。 log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器時${user.dir}對應tomcat的bin目錄;
log4j.appender.logfile.File=${user.home}/logs/app.log,${user.home}對應作業系統當前使用者目錄 log4j.appender.logfile.File=${webApp.root}/logs/app.log,${webApp.root}對應當前應用根目錄 暫時沒找到不修改log4j配置而實現上面需求的方法。在log4j配置檔案中可以獲取環境變數來配置,但變數裡沒有當前應用的名稱(不能直接通webApp.root,因為它在不同的例項名稱不一樣),嘗試在web.xml中增加listener,獲取應用名稱,然後呼叫System.setProperty("contextPath", sce.getServletContext().getContextPath());將上下文設定到系統變數中在log4j應用,但多例項執行時每個例項都會改變該屬性值。 結論,該問題的解決方法
: 1、手動修改配置,修改war名稱後手動修改web.xml和log4j配置檔案,實現上述需求。 2、通過其它程式來進行批量修改,若bat或maven等在修改war包名稱時,自動修改掉web.xml和log4j中相關配置。