log4j问题,或jboss问题。我几乎放弃了

时间:2017-02-06 13:34:41

标签: java hibernate logging jboss

我有以下情况: - jboss eap上的两个HA单例应用程序 - 每个都有自己的log4j.properties文件: APP1:

log4j.rootLogger=DEBUG, App1

log4j.appender.App1=org.apache.log4j.RollingFileAppender
log4j.appender.App1.append=true
log4j.appender.App1.File=${jboss.server.log.dir}/App1.log
log4j.appender.App1.MaxFileSize=10MB
log4j.appender.App1.MaxBackupIndex=10
log4j.appender.App1.threshold=TRACE
log4j.appender.App1.layout=org.apache.log4j.PatternLayout
log4j.appender.App1.layout.ConversionPattern=[%-5p] [%t] %d{yyyy MMM dd HH:mm:ss,SSS} (%C:%F:%L) - %m%n


log4j.logger.org.hibernate=DEBUG, App1
log4j.logger.com.arjuna=DEBUG, App1
log4j.logger.com.sun=ERROR,App1
log4j.logger.com.sun.xml.ws.transport.http.client.HttpTransportPipe=DEBUG,App1

App2的

log4j.rootLogger=DEBUG, App2

log4j.appender.App2=org.apache.log4j.RollingFileAppender
log4j.appender.App2.append=true
log4j.appender.App2.File=${jboss.server.log.dir}/App2.log
log4j.appender.App2.MaxFileSize=10MB
log4j.appender.App2.MaxBackupIndex=10
log4j.appender.App2.threshold=TRACE
log4j.appender.App2.layout=org.apache.log4j.PatternLayout
log4j.appender.App2.layout.ConversionPattern=[%-5p] [%t] %d{yyyy MMM dd HH:mm:ss,SSS} (%C:%F:%L) - %m%n


log4j.logger.org.hibernate=DEBUG, App2
log4j.logger.com.arjuna=DEBUG, App2
log4j.logger.com.sun=ERROR,App2
log4j.logger.com.sun.xml.ws.transport.http.client.HttpTransportPipe=DEBUG,App2

安装和运行相当嗯...有这个问题: App2的所有hibernate日志都是用App1.log编写的 此外,来自App2的所有com.sun.xml ...日志都是用App1.log编写的。 并且非(也不是hibernate和sun.xml)都写入App2.log。

org.hibernate和com.sun都被日志管理到应用程序中,在服务器级别它们处于ERROR级别,因此server.log中没有日志记录。

此外,如果我正在禁用App1,App2中的这两个类别将被记录到App1的日志文件中。

这显然是我想念和/或我真的不知道的事情。 现在,我的问题是我需要log4j才能记录我告诉它的事情。 谁能告诉我任何事情?而且,嗯,我真的不喜欢使用jboss日志记录设置(在console或standalone-ha.xml中使用自定义appender)。 我只想用log4j ... 谢谢大家。

1 个答案:

答案 0 :(得分:0)

Hibernate随JBoss一起提供(在modules \ system \ layers \ base \ org \ hibernate下)并在内部使用org.jboss.logging。并且org.jboss.logging也随JBoss一起提供。因此,我认为日志记录初始化仅对完整的JVM执行一次(因为org.jboss.logging是通过模块类加载器加载的,而不是通过应用程序类加载器加载,静态字段是特定于类加载器的。)

我建议(虽然你的要求听起来很奇怪),在你的应用程序中运送Hibernate和log4j(即在应用程序的lib /文件夹中)。然后Hibernate加载两次,第一次由类加载器加载第一个应用程序,第二次由类加载器加载第二次应用程序。这样静态字段可以存在两次。