2012-07-17 45 views
2

将现有的应用程序从Grails 1.3.7升级到Grails 2.0.4(也试过2.0.3)后,我得到了某种slf4jlog4j的冲突。似乎Grails 2.x loggers冲突(slf4j,log4j和commons-logging)

  • log4j的尝试写入使用共享记录
  • 共享记录写入SLF4J
  • 但SLF4J记录器附加器使用log4j

循环引用。结果是java.lang.StackOverflowError

java.lang.StackOverflowError 
    at org.apache.log4j.PatternLayout.format(PatternLayout.java:500) 
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) 
    at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) 
    at org.apache.log4j.Category.callAppenders(Category.java:206) 
    at org.apache.log4j.Category.forcedLog(Category.java:391) 
    at org.apache.log4j.Category.log(Category.java:856) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.logMessage(GrailsLog4jLoggerAdapter.java:191) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.error(GrailsLog4jLoggerAdapter.java:166) 
    at org.apache.commons.logging.impl.SLF4JLog.error(SLF4JLog.java:213) 
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) 
    at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) 
    at org.apache.log4j.Category.callAppenders(Category.java:206) 
    at org.apache.log4j.Category.forcedLog(Category.java:391) 
    at org.apache.log4j.Category.log(Category.java:856) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.logMessage(GrailsLog4jLoggerAdapter.java:191) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.error(GrailsLog4jLoggerAdapter.java:166) 
    at org.apache.commons.logging.impl.SLF4JLog.error(SLF4JLog.java:213) 
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) 
    at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) 
    at org.apache.log4j.Category.callAppenders(Category.java:206) 
    at org.apache.log4j.Category.forcedLog(Category.java:391) 
    at org.apache.log4j.Category.log(Category.java:856) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.logMessage(GrailsLog4jLoggerAdapter.java:191) 
    at org.slf4j.impl.GrailsLog4jLoggerAdapter.error(GrailsLog4jLoggerAdapter.java:166) 
    ... 

似乎log4j的日志,共享记录,公地洛

我试图排除依赖的log4j,并使用log4j-over-slf4j作为replaicement但一些Grails的类有直接Log4J的用法:

java.lang.NoClassDefFoundError: org/apache/log4j/LogManager 
    at org.slf4j.impl.GrailsSlf4jLoggerFactory.getLogger(GrailsSlf4jLoggerFactory.java:43) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:253) 
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272) 

我不能排除slf4j,因为它被标准的Grails插件使用,比如Resources插件。

顺便说一句,我从来没有这样的情况下,与其他Grails 2.0.3项目。看起来它只是针对当前应用程序的配置或依赖项,但我找不到任何不寻常的东西。

任何人都有同样的问题?

回答

3

通过取消注释默认appender的修正:

appenders { 
    console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n') 
} 

工作了,但它的怪异

0

我有同样的StackOverflowError。这发生在Grails在我的应用程序开始时尝试记录完全不同的例外情况时。所以这个问题与Grails日志记录异常有关。

我固定它通过注释掉此行我的log4j的配置(在Config.groovy):

error stdout: "StackTrace" 

此后,StackOverflowError消失了,我可以看到基本的异常。