2010-10-01 4 views
5

Ich schreibe eine Anwendung, die aus mehreren Maven-Modulen besteht. Alle müssen ihre eigenen Log-Dateien protokollieren. Ich habe eine log4j.properties-Datei im Haupt/Ressourcen-Ordner jedes Moduls erstellt. Wenn ich jetzt die Anwendung von einem der Module aus starte, schreibt es alles in die Protokolldatei dieses Moduls. Ich fragte mich, ob dies nur daran lag, dass es das Root-Verzeichnis von diesem Start-Modul genommen und das zum Speichern der Protokolldateien verwendet hatte, aber wenn ich einen Appender nur für dieses Start-Modul erstellte (mit Kategorie in den log4j-Eigenschaften) kein rootLogger es gibt mir einen Fehler über Klassen in den anderen Modulen, die ihre Appender nicht finden können, die anzeigt, dass die log4j.properties Dateien in jedem dieser Module nicht gefunden oder gelesen werden. Irgendwelche Ideen, wie man das löst und diese Module diese Eigenschaftendateien verwenden lässt, oder muss ich alle Appender in eine große log4j.properties Datei legen, die bewirkt, dass alle Logs im Stammordner dieses Startmoduls statt erscheinen die Stammordner dieser anderen Module?Log4j Eigenschaften von jedem Modul

Ich hoffe, die Frage ist klar genug zu verstehen, ansonsten zögern Sie nicht, nach Details zu fragen.

+1

Können Sie mehr Informationen über Ihre App geben; zB ist es eine Web App? Wird es auf einem App-Server bereitgestellt? – Qwerky

+0

Diese App wird jede Woche ausgeführt, um eine Datenbank zu aktualisieren, die Proteindaten enthält. Zuerst prüft es, ob neue Daten in mehreren anderen Datenbanken vorhanden sind. Wenn dies der Fall ist, liest es die Daten, führt dann eine Berechnung aus (indem es an einen speziellen Webservice gesendet wird, der die Berechnung durchführt) und die Daten von diesem Webservice zurückerhält gibt es in meine Proteindatenbank ein. Eines der Module ist ein Hibernate-Modul, das mit meiner Datenbank kommuniziert. Das Problem, das ich habe ist, dass Ruhezustand Art alles protokolliert, was es tut.Ich möchte diese Protokolle von den Protokollen der anderen Module trennen. – FinalArt2005

Antwort

0

Soweit ich weiß, wird nur die log4j.properties des aufgerufenen Moduls gelesen und initialisiert.

Wenn Sie die einzelnen Module von einem einzigen Startmodul aus aufrufen möchten, müssen Sie alle Ihre Appender zu einer einzigen Datei log4j.properties hinzufügen, die sich im Verzeichnis start-module/src/main/resources befindet. Wenn und wann Sie möchten, dass dies eine Architekturfrage ist.

Nur ein Vorschlag: Wechseln Sie jetzt zur XML-basierten Protokollierung, wenn Sie jetzt oder in Zukunft erweiterte Protokollierungssteuerungen wünschen.

0

Wenn Sie separate log4j.properties in die src/main/resources jedes einzelnen Moduls einfügen und die generierten jar-Dateien in einen einzelnen Klassenlader laden, wird nur eine Ressource geladen, da log4j die Eigenschaftendateien aus dem Klassenlader lädt (Ihre Ressourcen überlappen sich im Dateinamen).

Ich würde log4j.configuration Dateien in keine meiner JAR-Dateien enthalten. Aus zwei Gründen:

  • Funktioniert in Ihrem Fall nicht.

  • Um Log4j zu konfigurieren (Ausführlichkeit von Loggern), müsste ich die JAR-Datei öffnen und die Eigenschaftendatei bearbeiten.

Eine andere Lösung könnte sein, ein weiteres Modul macht eine schattierte (http://maven.apache.org/plugins/maven-shade-plugin/) JAR-Datei von dem übrigen Modulen Herstellung, einschließlich einer einzigen log4j.properties in src/main/resources. Wenn Sie dann ein anderes Modul verwenden, das Ihre früheren Projekte als Abhängigkeiten verwendet, können Sie die Abhängigkeit nur als Abhängigkeit angeben.

Aber das ist eine Lösung, die ich nicht verwenden würde.

Hoffe, dass hilft.

Verwandte Themen