1. 程式人生 > >tomcat下多個web應用使用相同的log4j的jar包,如何避免配置檔案發生衝突

tomcat下多個web應用使用相同的log4j的jar包,如何避免配置檔案發生衝突

我們在開發的時候通常會遇到再同一個伺服器下開發多個應用的情況,在公共jar包統一載入的情況下,如果log4j.properties配置不當,經常會發生多個應用的log日誌都列印到一個檔案裡了,如果配置檔案配置的是輸出所有log列印,那麼web應用的載入順序就是導致這個問題的根本原因,由於配置tomcat載入web應用的順序是一件比較繁瑣的事情,除非各個應用有強依賴關係,否則一般不建議去配置載入順序;這樣就會導致後加載的應用對log4j的配置覆蓋了之前應用的配置,最終所有log輸出都會出現在最後載入的應用所配置的log檔案;

那麼知道的原因之後,我們就可以尋找相應的解決方法了,這裡僅提供兩種作者覺得比較簡單且實用的方法;

第一種:將log4j的jar包移除統一載入的lib庫,放入單獨應用中各自載入,這樣就不會發生配置覆蓋的情況;

第二種:在log4j.properties配置category屬性,該屬性可以理解為根類過濾引數,還是例項說明吧,比如你做如下設定

### set log levels ###
log4j.rootLogger = INFO

### 輸出到控制檯 ###
<span style="background-color: rgb(255, 0, 0);">log4j.category.com = INFO, console </span>
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

### 雲平臺INFO ###
<span style="background-color: rgb(255, 0, 0);">log4j.category.com.test.cloud = INFO, LOG_TESTCLOUD</span> 
log4j.appender.LOG_TESTCLOUD = org.apache.log4j.RollingFileAppender
log4j.appender.LOG_TESTCLOUD .File = /logs/TestCloud/TestCloud.log
log4j.appender.LOG_TESTCLOUD .MaxFileSize = 500KB
log4j.appender.LOG_TESTCLOUD .MaxBackupIndex = 10
log4j.appender.LOG_TESTCLOUD .layout = org.apache.log4j.PatternLayout
log4j.appender.LOG_TESTCLOUD .layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} 

注意紅色標記部分即是設定category屬性,經過上述設定之後,所有在com之下的子包(子類)所列印的log都將輸出到控制檯,所有在com.test.cloud之下的子包(子類)所列印的log資訊,都將寫入/logs/TestCloud/TestCloud.log檔案;

所以建議不同web應用都要有不同的根包名,以便進行過濾;