2012-06-12 18 views
11

Volevo configurare Logback utilizzando Groovy DSL. Il file è molto semplice:Impossibile utilizzare logback.groovy, ma logback.xml funziona

import ch.qos.logback.classic.encoder.PatternLayoutEncoder 
import ch.qos.logback.core.ConsoleAppender 
import static ch.qos.logback.classic.Level.DEBUG 
import static ch.qos.logback.classic.Level.INFO 

appender("stdout", ConsoleAppender) { 
    encoder(PatternLayoutEncoder) { 
     pattern = "%d %p [%c] - <%m>%n" 
    } 
} 

root(INFO, ["stdout"]) 

Io uso Gradle per compilare la mia applicazione ed eseguirla con jettyRun. Viene visualizzato il seguente errore:

Failed to instantiate [ch.qos.logback.classic.LoggerContext] 
Reported exception: 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'ch.qos.logback.core.ConsoleAppender[null]' with class 'ch.qos.logback.core.ConsoleAppender' to class 'ch.qos.logback.core.Appender' 
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:360) 
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:599) 
at ch.qos.logback.classic.gaffer.ConfigurationDelegate.appender(ConfigurationDelegate.groovy:119) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at org.codehaus.groovy.runtime.metaclass.MixinInstanceMetaMethod.invoke(MixinInstanceMetaMethod.java:53) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:308) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149) 

Tuttavia, quando si passa alla configurazione XML equivalente, tutto funziona. Che cosa sto facendo di sbagliato?

Utilizzo di Logback 1.0.0. Provato con Logback 1.0.3.

risposta

0

GroovyCastException "non può lanciare ConsoleAppender come Appender" ha tutti i vantaggi di un problema di caricamento di classe. Quale versione di groovy è questa? Potresti aprire uno bug report includendo un caso di test per la riproduzione di questo issuew?

+0

OK, creerò un progetto di esempio. Io uso Groovy 1.8.6. – Infeligo

+0

Grande. In attesa di una segnalazione di bug. – Ceki

9

Ho trovato la soluzione, ma alcune domande rimangono aperte. Il problema era che non avevo Groovy corretto sul classpath. Ho deciso di fare un esempio di progetto per dimostrare questo bug. Ho iniziato con un'applicazione per console utilizzando il plug-in di "applicazione" di Gradle. Non ho incluso Groovy come dipendenza.

apply plugin: 'application' 

repositories { 
    mavenCentral() 
} 

ext.logbackVersion = '1.0.3' 
ext.slf4jVersion = '1.6.4' 

dependencies { 
    compile "ch.qos.logback:logback-classic:$ext.logbackVersion" 
    compile "org.slf4j:jcl-over-slf4j:$ext.slf4jVersion" 
    //runtime "org.codehaus.groovy:groovy:1.8.6" // the problem was here 
} 

mainClassName = "org.test.Main" 

Questo mi ha dato un errore, che è abbastanza veloce.

|-ERROR in ch.qos.logback.classic.LoggerContext[default] - Groovy classes are not available on the class path. ABORTING INITIALIZATION. 

OK, bello. Mancava la dipendenza, facile da risolvere. Ma perché non ho avuto lo stesso errore quando ho eseguito la mia applicazione web? L'aggiunta della dipendenza Groovy ha risolto il problema iniziale nell'applicazione web. Ho spogliato il mio progetto e creerò un JIRA corrispondente. Forse, Groovy sul rilevamento dei percorsi di classe non è del tutto corretto.

0

colleghi.

ho affrontato quasi lo stesso problema di oggi:

  • Quando uso logback.xml tutto funziona bene
  • Quando uso logback.groovy in IntelliJ IDEA eveything funziona bene anche
  • Quando uso logback.groovy quando iniziare la mia script dalla riga di comando Ho ricevuto molti errori come

:

D:\Projects\PRDMonitoring\sources>groovy tray.groovy PRD 
Failed to instantiate [ch.qos.logback.classic.LoggerContext] 
Reported exception: 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
Script1.groovy: 2: unable to resolve class ch.qos.logback.classic.filter.LevelFilter 
@ line 2, column 1. 
    import ch.qos.logback.classic.filter.LevelFilter 
^
Script1.groovy: -1: unable to resolve class ch.qos.logback.classic.encoder.PatternLayoutEncoder 
@ line -1, column -1. 
Script1.groovy: 3: unable to resolve class ch.qos.logback.core.ConsoleAppender 
@ line 3, column 1. 
    import ch.qos.logback.core.ConsoleAppender 
^
Script1.groovy: -1: unable to resolve class ch.qos.logback.classic.Level 
@ line -1, column -1. 
Script1.groovy: 6: unable to resolve class ch.qos.logback.core.spi.FilterReply 
@ line 6, column 1. 
    import static ch.qos.logback.core.spi.FilterReply.ACCEPT 
^
Script1.groovy: 7: unable to resolve class ch.qos.logback.core.spi.FilterReply 
@ line 7, column 1. 
    import static ch.qos.logback.core.spi.FilterReply.DENY 

Ma dopo un paio di minuti per trovare una soluzione che ho capito, che la seguente stringa prima@Grapes annotazione fissa un problema con le classi di carico @GrabConfig (systemClassLoader = true)

@GrabConfig(systemClassLoader=true) 
@Grapes([ 
    @Grab(group = 'org.codehaus.groovy.modules.http-builder', module = 'http-builder', version = '0.6'), 
    @Grab(group = 'org.apache.commons', module='commons-lang3', version='3.0'), 
    @Grab(group = 'commons-io', module = 'commons-io', version = '2.4'), 
    @Grab(group = 'joda-time', module = 'joda-time', version = '2.9.4'), 
    @Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.1.7'), 
    @Grab(group = 'ch.qos.logback', module = 'logback-core', version = '1.1.7') 
])