2012-04-03 2 views
4

ich diese Störung erhalte, wenn die Anlegesteg-Maven-Plugin ausgeführt wird:SLF4J/Log4J nicht in Anlegesteg-Maven-Plugin initialisiert

[INFO] --- jetty-maven-plugin:7.6.1.v20120215:start (start-jetty) @ rest --- 
log4j:WARN No appenders could be found for logger (org.eclipse.jetty.util.log). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

Das Projekt ist ein Krieg, der log4j.properties in WEB-INF/classes enthält.

Ich bin auch in den folgenden Eigenschaften zum Plugin vorbei, nur um zu sehen, was vor sich geht (das insbesondere log4j.properties Datei vorhanden ist in der Lage sowohl unterhalb als auch):

<!-- Log4J settings --> 
<systemProperty> 
    <name>log4j.configuration</name> 
    <value>file://${project.build.testOutputDirectory}/log4j.properties</value> 
</systemProperty> 
<systemProperty> 
    <name>log4j.debug</name> 
</systemProperty> 

Die Protokollierung in der Webapp funktioniert gut. Ich bin jedoch von dem Fehler verblüfft.

Ich habe diese Abhängigkeiten im Projekt:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-core</artifactId> 
</dependency> 

Zusätzlich wird, wenn die Tests (die Anlegestelle müssen) laufen beginnen, muss ich die folgende Ausgabe sehen:

log4j: Using URL [file:/project/foo/rest/target/test-classes/log4j.properties] for automatic log4j configuration. 
log4j: Reading configuration from URL file:/project/foo/rest/target/test-classes/log4j.properties 
log4j: Parsing for [root] with value=[ERROR, console]. 
log4j: Level token is [ERROR]. 
log4j: Category root set to ERROR 
log4j: Parsing appender named "console". 
log4j: Parsing layout options for "console". 
log4j: Setting property [conversionPattern] to [%d %p %c - %m%n]. 
log4j: End of parsing for "console". 
log4j: Parsed "console" options. 
log4j: Parsing for [project.foo] with value=[DEBUG]. 
log4j: Level token is [DEBUG]. 
log4j: Category project.foo set to DEBUG 
log4j: Handling log4j.additivity.project.foo=[null] 
log4j: Finished configuring. 

Könnte jemand sagen ich, warum Jetty ist unglücklich?

Antwort

5

Eine weitere Alternative ist "file: ///" zu verwenden, Stil URL für log4j.properties wie folgt:

<plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>8.1.10.v20130312</version> 
    <configuration> 
    <systemProperties> 
      <systemProperty> 
       <name>log4j.configuration</name> 
       <!-- have to use file:/// url since --> 
        <!-- Jetty is using classloader --> 
        <!-- before the webapp classloader is ready --> 
       <value>file:///${basedir}/src/main/resources/log4j.properties</value> 
      </systemProperty> 
    <configuration> 
    <dependencies> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.6.6</version> 
     </dependency> 
    </dependencies> 
</plugin> 

Ich hatte das gleiche Problem, wo Jetty wurde für die log4j.properties Datei suchen einen Classloader verwenden das enthielt den Quellcode meines Projekts nicht. SO hat es sich beschwert "log4j: WARN Es konnten keine Appender für logger (org.eclipse.jetty.util.log) gefunden werden.". Aber diese Problemumgehung hat es gelöst und ich kann die Protokollnachricht sehen und sie über log4j steuern.

1

Das Problem war, dass ich einen Aggregator mit mehreren Modulen habe, von denen jeder Jetty vor seinen Tests startet und dann stoppt. Beim Starten von Jetty habe ich <systemProperties/> definiert. Nachdem ich Jettys Quellen angeschaut habe, habe ich herausgefunden, dass Systemeigenschaften, die einmal von einem der Module gesetzt wurden, niemals später überschrieben werden (in anderen Modulen), weil es eine Regel im Plugin gibt, die dies verbietet. Daher wurden die Systemeigenschaften für die Protokollierung zwischen den Ausführungen verwirrt, obwohl sie sich in verschiedenen Untermodulen befanden.

Ich habe dies behoben, indem ich mein eigenes Maven-Plugin geschrieben habe, das die Systemeigenschaften für Sie vor der Ausführung festlegt. Ich habe das Projekt here in GitHub gestellt. Erläuterungen zur Verwendung finden Sie unter here.

+0

Vielen Dank für diese Lösung; Ihr Plugin funktionierte nicht für mich, aber ich konnte das Set-System-Properties-Ziel des Properties Maven-Plugins (http://mojo.codehaus.org/properties-maven-plugin) verwenden, um dasselbe zu erreichen. – piepera

+0

Ich habe tatsächlich einen Bug für die Jetty Jungs hier eingereicht: https://jira.codehaus.org/browse/JETTY-1507. Grundsätzlich wird das Plugin keine Systemeigenschaft überschreiben, die bereits existiert. Ich musste das auf die harte Tour finden. Es ist wirklich kein erwartetes Verhalten. Wenn Sie möchten, können Sie für das Ticket abstimmen. – carlspring

4

Wie in this message board thread angezeigt, können Sie log4j nicht mehr mit Systemeigenschaften im jetty-maven-plugin konfigurieren. Ab Jetty 7.5.0 verwenden Jetty-Klassen jetzt statische Protokollinitialisierer. Diese statischen Protokollinitialisierer bewirken, dass das Log4j-System initialisiert wird, bevor Systemeigenschaften geladen werden.

Zwei mögliche Problemumgehungen wären entweder ein Downgrade auf Jetty 7.4.5 oder die Verwendung eines separaten Maven-Plugins wie dem properties-maven-plugin zum Setzen der log4j-Systemeigenschaften vor der Initialisierung des Jetty-Plugins.

+0

Danke. Vielen Dank. Vielen Dank. Ich habe mit Systemeigenschaften und dem 8.x Jetty-Plugin für eine Weile gekämpft. Ich habe so viele Beiträge gelesen, aber das ist das erste, das funktioniert hat. – ksclarke