我遇到了在同一JVM中部署2个应用程序的问题。
我有2个应用程序说A& B在Websphere应用程序服务器中运行。
A是在EJB jar中具有log4j.jar的EJB项目
B也是EJB项目,但没有log4j.jar作为EJB jar的一部分,它引用了Websphere lib中可用的log4j jar。
A& B有独立的Logger类,比如说ALogger.java和BLogger.java。
ALogger.java有 static Logger logger = Logger.getLogger(“A.class)”);
BLogger.java有 static Logger logger = Logger.getLogger(“B.class)”);
log4j.properties都是不同的,日志写入差异文件
App A:
log4j.rootLogger=ALL,ErrorAppender,file
log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**AErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**ALog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5
App B:
log4j.rootLogger=ALL,ErrorAppender,file
log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**BErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**BLog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5
在处理A之后调用B时,log4j工作正常。
问题:如果B被触发,A正在运行,App A日志将被写入App B的日志文件。我该如何解决这个问题?
我尝试更改App B的appender名称,但它不起作用。
答案 0 :(得分:1)
Log4J在一个类加载器的范围内只读取一次配置(除非以编程方式指示其他方式)。
您的打包策略首先在WebSphere的类加载器中加载WebSphere的Log4J,该类加载器在类加载器层次结构中更高。 Log4J初始化并加载;之后,当您的应用程序(其中嵌入了log4j)进行日志记录调用时,Log4J发现它已经初始化,因此它甚至不会读取第二个属性文件。
为避免类似情况必须遵循的经验法则是:如果您正在使用实用程序JAR读取配置并将其静态存储在类加载器级别(例如:Log4J; Apache FOP;以及许多其他),然后,您必须将该JAR与您的应用程序捆绑在一起,并且不让您的代码引用AppServer提供的副本。
遵循这条规则,你就会变得更加精彩......即使在WebSphere,多年来,人们因其类加载策略造成一些混乱而臭名昭着。
答案 1 :(得分:0)
B也是EJB项目,但没有log4j.jar作为EJB jar的一部分,它引用了Websphere lib中可用的log4j jar
尝试改变它。让两个项目捆绑自己的log4j。截至目前,log4j可能会感到困惑。
答案 2 :(得分:0)
由于log4j是使用静态类初始化的,因此不应使用共享库位置,例如glassfish / lib。尝试在您的应用程序中捆绑log4j库。