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 プロジェクトでは、そのような状況はこれまでありませんでした。現在のアプリケーションのみに固有の構成または依存関係があるもののようですが、異常なものは見つかりません。
誰も同じ問題を抱えていましたか?