Po uaktualnieniu istniejącej aplikacji z Grails 1.3.7 do Grails 2.0.4 (także wypróbowałem 2.0.3) dostałem coś w tym rodzaju slf4j
i log4j
konflikt. Wygląda na to
- log4j próbuje napisać przy użyciu wspólnego logowania
- commons-logowanie napisz do slf4j
- ale program rejestrujący slf4j używa log4j
Odnośnik kołowy. I java.lang.StackOverflowError
w rezultacie.
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)
...
Wydaje się, że log4j loguje się do logowania wspólnego, commons-loggin
Próbowałem wykluczyć log4j z zależności i użyć log4j-over-slf4j
jako uzupełnienie, ale niektóre klasy Grails mają bezpośrednie użycie 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)
I nie mogę wykluczyć slf4j, ponieważ jest używany przez standardowe wtyczki Grails, takie jak wtyczka Resources.
A tak przy okazji, nigdy wcześniej nie miałem takiej sytuacjiinne projekty Grails 2.0.3. Wydaje się, że jest to coś z konfiguracją lub zależnościami specyficznymi tylko dla bieżącej aplikacji, ale nie mogę znaleźć niczego niezwykłego.
Czy ktoś miał ten sam problem?
Odpowiedzi:
3 dla odpowiedzi № 1Naprawiono przez odkomentowanie domyślnego programu dołączającego:
appenders {
console name:"stdout", layout:pattern(conversionPattern: "%c{2} %m%n")
}
Teraz pracuje, ale to dziwne
0 dla odpowiedzi nr 2
Miałem to samo StackOverflowError
. Stało się tak, gdy Grails próbował zarejestrować zupełnie inny wyjątek podczas uruchamiania mojej aplikacji. Problem ma więc coś wspólnego z wyjątkami rejestrowania Grails.
Naprawiłem to komentowanie ten wiersz w mojej konfiguracji log4j (w Config.groovy
):
error stdout: "StackTrace"
Po tym StackOverflowError
zniknął i mogłem zobaczyć podstawowy wyjątek.