是否可以在Tomcat5.5设置中使用单个log4j jar文件,其中可以由多个for应用程序使用,并为每个for应用程序进行单独的日志记录?
我编写了大约8个不同的real应用程序,其中log4j属性文件之间唯一真正的区别是日志文件名。但是,如果我试图将log4j从webapp /lib目录移到tomcat5共享/lib目录,就会遇到问题。
所有的属性文件基本上与下面的相同,我只是在代码中使用System.setProperty(" file.name“)设置了System.setProperty。没有必要,但我只是在尝试为所有组件使用一个属性文件的想法。
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基本上,对于每个组件,我想要登录到一个单独的文件,但是问题是,如果我将log4j包含在共享/lib目录下,那么无论哪个lib应用程序首先被访问,都有效地定义了所有lib应用程序将使用的日志文件。也就是说,我不能使用单独的配置。
我知道的替代方案是:将log4j放到每个war文件的webapp /lib目录中,这样我就可以为每个webapp获得一个单独的配置。
将上面的"LogFile“引用更改为特定于每个webapp,以便每个属性文件有效地定义一个单独的配置。这似乎避免了以下错误"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我更倾向于坚持第一个属性文件的布局,并尽可能保持它在webapps之间的相似,并且也不希望在每个not应用程序中都包含一个单独的log4j副本。理想情况下,我希望只使用从tomcat共享lib目录到log4j系统副本的符号链接。
还有其他选择吗?
发布于 2010-08-23 15:58:05
我不会这么做的。让每个webapp都有自己的log4j.jar和自己的log4j.properties文件。即使您在所有其他方面都能做到这一点,您也永远无法在一个webapp上升级log4j,而且您将很难在不影响其他应用程序的情况下修改一个应用程序的日志记录。
除了维护上的痛苦和痛苦之外,如果log4j保留类引用,就有可能导致巨大的内存泄漏。每次重新部署Tomcat使用所有类的新版本创建一个新的应用程序类加载器时,都无法消除旧的引用,因为log4j不知道如何释放它们,因此恢复内存的唯一方法是重新启动Tomcat实例。
这里有一篇关于使用容器级日志记录的有趣文章。它描述了你所看到的问题:
当您在容器的lib路径中部署log4j时,如果容器不是“log4j感知的”,并且不为log4j设置"Context Repository Selector“,那么就失去了一个主要的特性日志配置,即容器中所有组件的日志配置都是全局的。只读取一个日志配置文件(从容器的类路径中读取),容器中的每个组件都看到相同的日志配置。这一点根本比不上共用日志记录。在大多数情况下,这是不可接受的行为;但是,如果有人认为这是有用的,公共日志记录可能会提供以这种方式进行操作的特性。 当您在容器的lib路径中部署log4j并使用"Context Repository“行为获取每个组件的日志配置时,log4j也在组件的路径中,您将得到类强制转换异常(commons当前面临相同的问题)。这确实是另一个问题。 当您在容器的lib路径中部署log4j并使用"Context Repository Selector“行为获取每个组件的日志配置时,并且log4j不在组件的路径中,那么您将以完全相同的方式获得内存泄漏,这与公共日志记录的方式完全相同,而且原因完全相同。
最简单的解决方案是通过在每个应用程序的WEB/lib中保留log4j来避免这个问题。
https://stackoverflow.com/questions/3549226
复制相似问题