2010-08-23 28 views
2

是否可以在tomcat 5.5安裝程序中使用單個log4j jar文件,它可以被多個webapps使用併爲每個webapp單獨記錄?在Tomcat5中使用單獨的屬性文件在多個webapps之間共享一個log4j jar文件

我有大約8個不同的webapps寫在哪裏log4j屬性文件之間的唯一真正區別是日誌文件名。但是,如果我嘗試將log4j從webapp WEB-INF/lib目錄移動到tomcat5 shared/lib目錄,則會遇到問題。

所有屬性文件基本上看起來與下面的一樣,我只是在代碼中使用System.setProperty(「file.name」,)設置file.name。實際上並不是必須的,但我正在爲所有組件使用單個屬性文件的想法。

log4j.rootLogger=DEBUG, LogFile 
# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

# LogFile 
log4j.appender.LogFile=org.apache.log4j.RollingFileAppender 
log4j.appender.LogFile.File=${file.name} 
log4j.appender.LogFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.LogFile.MaxFileSize=500KB 
log4j.appender.LogFile.MaxBackupIndex=5 
log4j.appender.LogFile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

基本上爲各成分的我想登錄到一個單獨的文件,然而,問題是,如果我包括共享/ lib目錄下的log4j,取其web應用被第一次訪問,有效地限定了日誌該文件將被所有的webapps使用。即我不能使用單獨的配置。

我知道的替代方案: 將log4j放入每個war文件的WEB-INF/lib目錄中,這樣我就可以爲每個webapp分別配置一個配置。

將上面的「LogFile」引用更改爲特定於每個Web應用程序,以便有效地由每個屬性文件定義單獨的配置。這似乎避免以下的錯誤「的log4j:ERROR A‘org.apache.log4j.RollingFileAppender進行’對象不是分配給一個‘org.apache.log4j.Appender

即使用類似的’變量。」以下:

對於WebApp1

log4j.rootLogger=DEBUG, LogFileWebapp1 
# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

# LogFile 
log4j.appender.LogFileWebapp1=org.apache.log4j.RollingFileAppender 
log4j.appender.LogFileWebapp1.File=${file.name} 
log4j.appender.LogFileWebapp1.layout=org.apache.log4j.PatternLayout 
log4j.appender.LogFileWebapp1.MaxFileSize=500KB 
log4j.appender.LogFileWebapp1.MaxBackupIndex=5 
log4j.appender.LogFileWebapp1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

對於webapp2的

log4j.rootLogger=DEBUG, LogFileWebapp2 
# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

# LogFile 
log4j.appender.LogFileWebapp2=org.apache.log4j.RollingFileAppender 
log4j.appender.LogFileWebapp2.File=${file.name} 
log4j.appender.LogFileWebapp2.layout=org.apache.log4j.PatternLayout 
log4j.appender.LogFileWebapp2.MaxFileSize=500KB 
log4j.appender.LogFileWebapp2.MaxBackupIndex=5 
log4j.appender.LogFileWebapp2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

我寧願堅持使用的佈局第一個屬性文件並儘可能保持它與web應用程序之間的相似性,並且也不會在每個web應用程序中包含一個單獨的log4j副本。理想情況下,我希望只使用從tomcat共享庫目錄到系統副本log4j的符號鏈接。

還有其他的選擇嗎?

回答

5

我不會這樣做。讓每個webapp都有自己的log4j.jar和它自己的log4j.properties文件。即使您在所有其他方面都能夠正常工作,您將永遠無法僅在一個Web應用程序上升級log4j,並且您將很難修改一個應用程序的日誌記錄而不會影響其他應用程序。

除了維護的痛苦和痛苦之外,如果log4j包含類引用,則可能導致巨大的內存泄漏。每次重新部署Tomcat都會創建一個具有所有類的新版本的新應用程序類加載器,無法擺脫舊引用,因爲log4j不知道放棄它們,回收內存的唯一方法是重新啓動Tomcat實例。

Here's an interesting article on using container-level logging.它描述你所看到的問題:

當部署在一個容器 不是「log4j的感知」的容器的lib路徑的log4j,你不成立「上下文存儲庫 選擇器「對於log4j,您失去了一項主要功能 - 日誌記錄配置 在容器中的所有組件上變爲完全全局的。只有 讀取了一個日誌記錄配置文件(來自容器的 類路徑),並且容器中的每個組件都看到相同的日誌記錄 配置。這根本不可與普通日誌相媲美。 在大多數情況下,這是不可接受的行爲;但是 如果有人認爲這很有用,commons-logging可能會提供一種以這種方式運行的功能。

當您部署在容器的lib路徑Log4j和使用「上下文 庫選擇」的行爲每個組件的記錄 配置和log4j的獲得也是組件的路徑你會得到一流的 轉換異常(共享記錄目前患有相同的 問題)。這實際上是一個單獨的問題。

當您部署在容器的lib路徑Log4j和使用「上下文 庫選擇」的行爲,讓每分量記錄 配置,Log4j是不是在組件的路徑,那麼你將 得到內存泄漏如出一轍正如出現在 commons-logging中一樣,原因完全相同。

最簡單的解決方案是通過在每個應用程序的WEB-INF/lib中保留log4j來避免該問題。

相關問題