2010-08-23 53 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来避免该问题。

相关问题