2008-10-20 9 views
15

Ich habe ein Problem wih eine Logging-Einrichtung in einem apring Webapp unter tomcat eingesetzt 6.Problem Commons Logging/Log4j Setup im Frühjahr Webapp mit tomcat 6

Die Webapp verwenden den commons-logging api, auf Runtime log4j sollte verwendet werden. Die Protokolldatei wird erstellt, bleibt jedoch leer - es finden keine Protokolleinträge statt.

die Einrichtung ist folgende:

WEB-INF/web.xml:

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/log4j.xml</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

WEB-INF/classes/commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger 

WEB- INF/log4j.xml:

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    ... 
    </appender> 
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="${catalina.home}/logs/my.log"/> 
    ... 
    </appender> 

    <logger name="my.package"> 
    <level value="INFO"/> 
    </logger> 

    <root> 
    <level value="ERROR"/> 
    <appender-ref ref="CONSOLE"/> 
    <appender-ref ref="FILE"/> 
    </root> 
</log4j:configuration> 

Die Datei logs/my.log wird erstellt, es werden jedoch keine Protokolle angezeigt. Das sind Info-Logs auf der Tomcat-Konsole, aber nicht mit dem Layout-Muster konfiguriert.

Die Commons-Logging-1.1.1.jar und Log4j-1.2.14.jar sind in WEB-INF/lib enthalten. Irgendeine Idee, was hier falsch ist?

Antwort

10

Es gibt zahlreiche dokumentierte Instanzen im Internet, die Leute über die Verwendung von Commons-Logging warnen. So sehr, dass SLF4J eine Menge Popularität gewinnt.

Wenn Sie nicht daran interessiert sind, Tomcat mit Log4j zu verwenden, sollten Sie Log4j direkt in Ihrer Anwendung verwenden. Vor allem, wenn es keine Chance gibt, dass Sie in Zukunft die Logging-Frameworks wechseln werden. Es wird die Komplexität Ihrer Anwendung reduzieren und alle Probleme mit dem Class Loader beseitigen, die Sie mit Commons-Logging haben.

Dies sollte eine relativ einfache Suche und ersetzen in Ihrem Text sein, wie commons-logging und log4j beide eine ähnliche Aufrufstruktur für ihre Protokollierungsmethoden verwenden.

+1

Ich denke Commons-Logging (seit 1.1, dort wo Bugs zu Speicherlecks vorher) ist in Ordnung. Aber vielleicht ist es die beste Lösung, um log4j direkt zu verwenden - die Bibliotheken werden mit commons-logging unlogged verlassen. –

+0

Das alles funktionierte in Tomcat 5.5 - manchmal wird es immer schlimmer –

+1

Nein, commons-logging ist immer noch Müll (2010), benutze slf4j. http://articles.qos.ch/thinkAgain.html – Manius

1

Sie müssen die zusätzliche Komponente für die vollständige Commons-Protokollierung kompilieren. Standardmäßig verwendet Tomcat 6 eine fest codierte Implementierung von commons-logging, die immer an java.util.logging delegiert.

Bauanleitung hier http://tomcat.apache.org/tomcat-6.0-doc/building.html

ersetzt dann die tomcat-juli.jar im Verzeichnis/sind von Tomcat und legen Sie den tomcat-juli-adapters.jar im Verzeichnis/lib zusammen mit log4j und Konfig.

+0

Ich werde nicht nicht den Kater selbst mit log4j einzuloggen, nur meine Web-App. Oder gibt es einen Tomcat-Classloader-Bug, der es nicht erlaubt, mein eigenes Commons-Logging zur Verfügung zu stellen? –

+0

Wenn Tomcat die Commons Logging-Klassen im lib-Pfad hat, wird diese geladen, bevor JARs in WEB-INF/lib geladen werden. –

+0

Das Problem ist das Design des Klassenladers in Tomcat 6 (Common sollte kein System als Eltern haben). –

5

Seien Sie besonders vorsichtig, dass Sie nicht log4j.jar im Verzeichnis Tomcat commons/lib platziert haben. Wenn der Root-Classloader die log4j-Bibliotheken lädt, treten Konflikte und Initialisierungsprobleme auf, wenn Ihre Webapps versuchen, log4j zu verwenden.

Wenn Sie log4j für die allgemeine Tomcat-Protokollierung verwenden müssen, müssen Sie darauf achten, dass Ihre Webapps nicht versuchen, log4j ebenfalls zu laden. Wenn Sie mehrere Webapps auf dem Server haben, brauchen Sie Disziplin, dass die Log-Initialisierung jedes Webapps nicht auf die Initialisierung anderer Webapps stampft. Jede Webanwendung muss eindeutige Logger-IDs verwenden, die mit eindeutigen Paketnamen ausgeführt werden können.

Die Verwendung eines gemeinsamen log4j in Tomcat mit mehreren Webapps führt zu schwerwiegenden Konflikten, wenn Sie gemeinsam genutzte Bibliotheken freigeben, z. B. Hibernate oder Spring. Die nächste Webanwendung, die versucht, log4j zu initialisieren, schließt möglicherweise den Logger des vorherigen.Es kann ein Durcheinander sein.

-1

Kann ich falsch liegen. Bitte versuchen Sie folgendes:

A) hinzufügen appender my.package: OR B) Reduzieren Sie die Log-leve von der Wurzel bis zur INFO

+0

Es ist nicht so einfach, ich weiß log4j zu konfigurieren. –

0

, wenn Sie mit Log4j + gemeinsame Protokollierung, können Sie die meisten der oben genannten Konfigurationen vermeiden. Gemeinsame Protokollierung LogFactory verfügt über eine ähnliche Erkennungsfunktion wie JAXP, nach folgender Priorität: Suche nach Protokollimplementierungen, 1. Konfigurationsattribut org.apache.commons.logging.Log innerhalb der Datei commons-logging.properties 2. Systemeigenschaft org.apache. commons.logging.Log 3. Wenn das Log4J im Klassenpfad verfügbar ist, verwenden Sie die entsprechende Wrapper-Klasse (Log4JLogger). 4. Jdk14Logger 5. SimpleLog

nur sicherstellen, dass sowohl Common-logging.jar und Common-Logging-api.jar und log4j.jar bei Classpath.

3

Ich hatte ähnliches Problem und eine Lösung gefunden. tomcat mit zusätzlichen Parametern Start:

-Dorg.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl

+0

Arbeitete für mich !! Vielen Dank ! Seit 1 Woche festgefahren: P –

+0

Seit Tagen kämpfe ich - danke! – Marplesoft