使用单独的属性文件在多个webapps之间共享Tomcat5中的单个log4jjar文件

使用单独的属性文件在多个webapps之间共享Tomcat5中的单个log4jjar文件,log4j,tomcat5.5,web-applications,Log4j,Tomcat5.5,Web Applications,在tomcat 5.5安装程序中是否可以使用单个log4j jar文件,其中可以由多个Web应用程序使用,并且每个Web应用程序都有单独的日志记录 我写了大约8个不同的webapp,其中log4j属性文件之间唯一真正的区别是日志文件名。但是,如果我试图将log4j从webapp WEB-INF/lib目录移动到tomcat5 shared/lib目录,我就会遇到问题 所有属性文件基本上与下面的一个相同,我只是在代码中使用System.setProperty(“file.name”)设置file.

在tomcat 5.5安装程序中是否可以使用单个log4j jar文件,其中可以由多个Web应用程序使用,并且每个Web应用程序都有单独的日志记录

我写了大约8个不同的webapp,其中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
基本上,对于每个组件,我都希望登录到一个单独的文件中,但是问题是,如果我在shared/lib目录下包含log4j,无论哪个webapp首先被访问,都会有效地定义所有webapp将使用的日志文件。i、 我不能使用单独的配置

我知道的备选方案有: 将log4j放入每个war文件的WEB-INF/lib目录中,这样我将为每个webapp获得单独的配置

将上面的“LogFile”引用更改为特定于每个webapp,以便有效地由每个属性文件定义单独的配置。这似乎避免了以下错误“log4j:error“org.apache.log4j.RollingFileAppender”对象不能分配给“org.apache.log4j.Appender”变量。

i、 e.使用类似以下的方法:

对于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
我更愿意坚持第一个属性文件的布局,并在webapps之间保持尽可能相似的布局,并且不必在每个webapps中包含单独的log4j副本。理想情况下,我希望只使用一个从tomcat共享lib目录到log4j系统副本的符号链接


还有其他选择吗?

我不会这么做。让每个webapp都有自己的log4j.jar和自己的log4j.properties文件。即使在所有其他方面都能做到这一点,您也永远无法在一个webapp上升级log4j,并且您将很难在不影响其他应用程序的情况下修改一个应用程序的日志记录

除了维护的痛苦外,如果log4j保留类引用,还可能导致巨大的内存泄漏。每次重新部署Tomcat时,都会创建一个新的应用程序类加载器,其中包含所有类的新版本,因为log4j不知道如何释放旧引用,所以无法摆脱旧引用,回收内存的唯一方法就是重新启动Tomcat实例

它描述了您看到的问题:

在容器的lib路径中为 没有“log4j感知”,并且您没有设置“上下文存储库” 选择器“对于log4j,您将丢失一个主要功能-日志配置 在容器中的所有组件中成为完全全局的。只有 读取一个日志配置文件(从容器的 类路径),容器中的每个组件都会看到相同的日志记录 配置这根本无法与commons日志进行比较。 在大多数情况下,这是不可接受的行为;然而 commons日志可能会提供一个功能,以这种方式运行,如果 任何人都认为这是有用的

在容器的lib路径中部署log4j并使用“上下文 存储库选择器“获取每个组件日志记录的行为 配置和log4j也在您获得类的组件路径中 强制转换异常(commons日志记录目前也面临相同的问题) 问题)。这实际上是一个单独的问题

在容器的lib路径中部署log4j并使用“上下文 存储库选择器“获取每个组件日志记录的行为 配置和log4j不在组件的路径中,那么您将 获取内存泄漏的方式与获取内存泄漏的方式完全相同 commons日志,出于完全相同的原因

最简单的解决方案是通过在每个应用程序的WEB-INF/lib中保留log4j来避免这个问题