2

slf4j既存のアプリを Grails 1.3.7 から Grails 2.0.4 にアップグレードした後 (2.0.3 も試しました) 、何らかのlog4j競合が発生しました。のようだ

  • log4j は commons-logging を使用して書き込みを試みます
  • commons-logging slf4j への書き込み
  • ただし、slf4j logger アペンダーは 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)

また、Resources プラグインなどの標準の Grails プラグインで使用されているため、slf4j を除外することはできません。

ところで、他の 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 に答える