Frage

Ich habe eine EAR mit Strukturen wie:

APP.ear 
- APP1.war
    - WEB-INF/classes/log4j.properties
- APP2.war
    - WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)

Ich mag, dass jeder IST ihr eigenes Anwendungsprotokoll haben. Aber es scheint, die obige Konfiguration funktioniert nicht. Melden Sie sich für APP1 und APP2 geht an APP1 Logbuch. Gibt es trotzdem separate Anwendung Protokolle zu erstellen?

War es hilfreich?

Lösung

Es stellt sich heraus, dass es aufgrund des Klassenlader unmöglich ist. Die Classloader-Hierarchie ist wie:

Anwendungsclassloader -> Ejb Classloader -> Krieg Klassenladeprogramm

Um ein sepearte Protokoll für einzelnen Krieg zu haben, kann man innerhalb Krieges setzen log4j.jar und lassen Sie die log4j den Krieg verwendet Classloader. Aber da beide app1-ejb.jar und app2-ebj.jar auch log4j verwenden müssen, kann die log4j.jar nur auf der obersten Ebene platziert werden. So ist die log4j ist auf Anfrage Classloader-Ebene.

Ich kann eine einzelne log4j Config angeben anderes Paket an verschiedene Dateien zu protokollieren. Aber für die gemeinsame Bibliothek wie Feder, kann das Protokoll nicht sepearted werden.

Andere Tipps

Der Grund ist es Arbeit des Ball hielt, weil die log4j an der Wurzel Ort vorhanden ist, anstatt jeden Krieg läßt eine log4j.jar in seinem WEB-INF / lib und entfernen Sie die log4j.jar von der Wurzel.

Für weitere Informationen über diese auf das meine Blog-Artikel verweisen http://techcrawler.wordpress.com/

Sie können auch tun, indem dynamisch die Dateieigenschaften in den Eigenschaften Ändern des PropertyConfigurator in Code-Datei.

Logback ist eine praktikable Lösung, um dieses Problem zu lösen. Schauen Sie sich um verschiedene Hacks Nachdem diese Arbeit mit log4j zu machen, haben wir zu Logback wechseln entschieden. Ich habe die folgende Konfiguration mit Logback Glas in der Webapp verwendet.

Eine Logback Datei im Webapp, die eine externe Datei enthalten:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration scan="true" scanPeriod="10 seconds">
        <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
            <resetJUL>true</resetJUL>
        </contextListener>

        <contextName>${project.artifactId}</contextName>

        <jmxConfigurator />

        <include file="${logback.configuration.filepath}" />
    </configuration>

${logback.configuration.filepath} während Maven-Filterung durch den genauen Pfad, außerhalb der Webapp der Konfigurationsdatei (so etwas wie /opt/server/conf/loback.included.conf ) ersetzt wird.

Und dann wird der Inhalt des logback.included.conf (diese Datei Teil des projetct ist, mit build-helper:attach-artifact geliefert, so ${project.artifactId} auch bei Maven Filterung ersetzt wird):

    <?xml version="1.0" encoding="UTF-8" ?>
    <included>
        <appender name="file" class="ch.qos.logback.core.FileAppender">
            <file>/var/log/server/${project.artifactId}.log</file>
            <encoder>
                <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
            </encoder>
        </appender>

        <root level="INFO">
            <appender-ref ref="file" />
        </root>
    </included>

Nur Einschränkung der Inhalt der Datei enthalten muss mit dem des Inklusions kompatibel sein. Nur Regeln in der Tat zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top