2013-07-03 8 views
7

Ich habe ein Problem mit dem Logback. Ich habe es eingerichtet (mit Maven) und alles scheint in Ordnung, außer dass Logback meldet, dass es die Konfigurationsdatei nicht finden kann (aber ich kann mich mit der Standard-Logger-Konfiguration an der Konsole anmelden).Logback kann logback.xml nicht finden, obwohl es existiert (im Klassenpfad)

[# | 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 [default] - Konnte keine Ressource finden [logback.groovy]

07: 54: 39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - Konnte die Ressource [logback-test.xml] nicht finden

07: 54: 39,844 | -INFO in ch.qos.logback.classic.LoggerContext [Standard] - Konnte die Ressource [logback.xml] nicht finden

07: 54: 39,847 | -INFO in ch.qos.logback.classic.LoggerContext [Standard] - Standardkonfiguration einrichten. | #]

Ich habe die Konfigurationsdatei (genannt logback.xml) in den src/main/resources Ordner meines Maven Artefakt (was ein Krieg ist). Interessanterweise, wenn ich die Config aus dem Classpath zu laden versuchen, es mir gelingt:

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); 

Welche druckt mein Beispielkonfigurationsdatei:

[#|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>|#] 

Mein pom.xml hat folgende Einträge:

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

Die als WAR-Datei (innerhalb einer EAR-Datei) gepackt ist. Der Speicherort der logback.xml in der WAR-Datei ist wie folgt: WEB-INF/classes/logback.xml

Hat jemand eine Idee, was ist falsch mit meinem Setup?

Vielen Dank für Ihre Hilfe

stupidSheep

+0

Sind Sie sicher, dass Sie Logback von Ihrem Krieg und nicht vom Anwendungsserver verwenden? –

Antwort

5

Die Lage innerhalb der WAR-Datei korrekt ist, WEB-INF/classes.

Die logback configuration documentation spricht darüber, wo die logback.xml-Datei in einem Krieg gefunden werden kann, aber nichts über eine EAR erwähnt.

Könnten Sie bitte die Informationen unter diesem Link versuchen? Ich frage mich, ob es auf eine bestimmte Weise in die EAR verpackt werden muss.

  1. Glassfish 3 + ear + logback.xml

(edit: zweite Link entfernt, hat nicht funktioniert).

+0

Ja, es war ein Tippfehler (ich habe es in der Frage behoben). Die vorgeschlagene Lösung in Ihrem ersten Link (Glassfish 3 + ear + logback.xml) hat funktioniert !! Danke vielmals! Ich musste einfach ein neues Maven-Modul hinzufügen und "logback.xml" zum Ordner src/main/resources hinzufügen. Dann musste ich das neu erstellte Maven-Modul als Kompilier-Abhängigkeit zu meinem WAR-Modul hinzufügen. Das hat den Trick gemacht! Der zweite Link funktionierte nicht für mich (obwohl ich die MANIFEST.MF-Dateien erstellt und die Klassenpfadeinträge hinzugefügt hatte, logback meldete immer noch, dass er die Konfiguration nicht finden konnte.) Danke, nocheinmal! – stupidSheep

+0

Du bist Willkommen Herr Schaf, und danke für die Frage, ich habe nie darüber nachgedacht, wo logback.xml in einem EAR sein sollte, und so jetzt weiß ich auch :) – vikingsteve

3

Logback an den Code in Ihrem Beispiel, das heißt getClassLoader() getResourceAsStream ("logback sehr ähnlichen Code ruft .xml "). Wenn Logback logback.xml nicht finden kann, muss die Ressource für den Klassenlader, der die Logback-Klasse geladen hat, nicht sichtbar sein. Dieser Klassenlader ist höchstwahrscheinlich anders als der Klassenlader, der Ihren Testcode geladen hat, der logback.xml finden kann.

+0

Hm, ich weiß nicht viel über die Art, wie Klassenlader arbeiten. Aber beide Male (einmal während des Starts, einmal nach der Bereitstellung) wurde der Code innerhalb des Containers ausgeführt (GlassFish 3). Einmal während des Hochfahrens/der Bereitstellung der EAR-Datei, das zweite Mal, als die Anwendung geladen wurde (durch eine JSF @ManagedBean - in derselben Klasse, in der ich den Logger benutzte). Außerdem funktionierte die Problemumgehung mit einer zusätzlichen JAR-Datei (siehe akzeptierte Antwort). Danke trotzdem! – stupidSheep