2

slf4j在将现有应用程序从 Grails 1.3.7 升级到 Grails 2.0.4(也尝试过 2.0.3)后,我遇到了一些log4j冲突。看来

  • log4j 尝试使用 commons-logging 写入
  • 公共日志写入 slf4j
  • 但是 slf4j logger appender 使用 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 记录到 commons-logging、commons-loggin

我试图从依赖项中排除 log4j,并log4j-over-slf4j用作替换,但一些 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 项目中,我以前从未遇到过这种情况。似乎它具有特定于当前应用程序的配置或依赖关系,但我找不到任何不寻常的东西。

有人有同样的问题吗?

4

2 回答 2

3

通过取消注释默认附加程序修复:

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

现在工作,但很奇怪

于 2012-07-17T16:16:55.917 回答
0

我有同样的StackOverflowError。当 Grails 在我的应用程序启动期间尝试记录一个完全不同的异常时,就会发生这种情况。所以这个问题与 Grails 记录异常有关。

我通过在我的 log4j 配置中注释掉这一行来修复它(in Config.groovy):

error stdout: "StackTrace"

之后StackOverflowError消失了,我可以看到潜在的异常。

于 2016-02-02T18:05:05.110 回答