/ / Grails 2.x konflikt rejestratorów (slf4j, log4j i wspólne logowanie) - grails, log4j, slf4j

Grails 2.x konflikt rejestratorów (slf4j, log4j i commons-logginging) - grails, log4j, slf4j

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 № 1

Naprawiono 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.