2013-07-03 14 views
7

Ho un problema con il logback. L'ho configurato (usando Maven) e tutto sembra a posto, tranne che Logback segnala che non riesce a trovare il file di configurazione (ma sono in grado di accedere alla console usando la configurazione del logger predefinita).Logback non riesce a trovare logback.xml anche se esiste (sul classpath)

[# | 2013-07-03T07: 55: 30,843 + 0200 | INFO | glassfish3.1.2 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 124; _ThreadName = Thread-2; | 07: 54: 39,844 | -INFO in ch.qos.logback.classic.LoggerContext [impostazione predefinita] - Impossibile trovare la risorsa [logback.groovy]

07: 54: 39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - Impossibile trovare la risorsa [logback-test.xml]

07: 54: 39,844 | -INFO in ch.qos.logback.classic.LoggerContext [predefinito] - Impossibile trovare la risorsa [logback.xml]

07: 54: 39,847 | -INFO in ch.qos.logback.classic.LoggerContext [predefinito] - Impostazione della configurazione predefinita. | #]

ho messo il file di configurazione (chiamato logback.xml) nella cartella src/main/resources del mio Maven manufatto (che è una guerra). È interessante notare che, se tento di caricare la configurazione dal classpath, riesco:

Reader r = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("logback.xml")); 
StringWriter sw = new StringWriter(); 
char[] buffer = new char[1024]; 
for (int n; (n = r.read(buffer)) != -1;) 
    sw.write(buffer, 0, n); 
String str = sw.toString(); 
System.out.println(str); 

che stampa il mio campione file di configurazione:

[#|2013-07-03T07:55:30.844+0200|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=124;_ThreadName=Thread-2;|<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- encoders are assigned the type 
      ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="debug"> 
     <appender-ref ref="STDOUT" /> 
    </root> </configuration>|#] 

miei pom.xml presenta le seguenti voci:

 <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.0.13</version> 
     </dependency> 

     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-core</artifactId> 
      <version>1.0.13</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.5</version> 
     </dependency> 

Compilato come file WAR (all'interno di un file EAR). La posizione del file logback.xml all'interno del file WAR è la seguente: WEB-INF/classes/logback.xml

Qualcuno ha un'idea di cosa c'è che non va nel mio setup?

Molte grazie per il vostro aiuto

stupidSheep

+0

Sei sicuro di utilizzare il logback da war e non dal server delle applicazioni? –

risposta

5

La posizione all'interno del file WAR è corretta, WEB-INF/classes.

Il logback configuration documentation parla di dove il file logback.xml può trovarsi all'interno di una guerra, ma non menziona nulla su un EAR.

Potresti provare le informazioni a questo link? Mi chiedo se debba essere impacchettato nell'AER in un modo specifico.

  1. Glassfish 3 + ear + logback.xml

(edit: secondo collegamento rimosso, non ha funzionato).

+0

Sì, era un refuso (l'ho risolto nella domanda). La soluzione proposta nel tuo primo link (Glassfish 3 + ear + logback.xml) ha funzionato !! Grazie molto! Ho semplicemente dovuto aggiungere un nuovo modulo Maven e aggiungere "logback.xml" alla cartella src/main/resources. Poi ho dovuto aggiungere il modulo Maven appena creato come una dipendenza di compilazione al mio modulo WAR. Questo ha fatto il trucco! Il secondo collegamento non ha funzionato per me (anche se ho creato i file MANIFEST.MF e aggiunto le voci del percorso classe, il logback riportava ancora che non è possibile trovare la configurazione .. Anway, molte grazie ancora! – stupidSheep

+0

benvenuto mister sheep, e grazie per la domanda, non ho mai pensato a dove logback.xml dovrebbe trovarsi all'interno di un EAR, e così ora so anche io :) – vikingsteve

3

Logback invoca codice molto simile al codice nel tuo esempio, cioè getClassLoader() getResourceAsStream ("logback .xml "). Se logback non riesce a trovare logback.xml, è necessario che la risorsa non sia visibile al programma di caricamento classi che ha caricato la classe di logback. Questo programma di caricamento classi è molto probabilmente diverso dal programma di caricamento classe che ha caricato il codice di test che può trovare logback.xml.

+0

Hm, non so molto sul modo in cui funzionano i programmi di caricamento classe. Ma entrambe le volte (una volta durante l'avvio, una volta dopo l'implementazione) il codice è stato eseguito all'interno del contenitore (GlassFish 3). Una volta durante l'avvio/distribuzione del file EAR, la seconda volta che l'applicazione è stata caricata (da un JSF @ManagedBean - nella stessa classe in cui ho usato il logger). Anway, la soluzione con un file jar extra ha funzionato (vedi risposta accettata). Grazie comunque! – stupidSheep