2012-06-29 6 views
5

Ich habe gerade eine bestehende Webanwendung bei der Arbeit abgeholt, die ihre Aktivität mit Log4J protokollieren soll. Ich habe meinen Arbeitsbereich genau so konfiguriert, wie mir gesagt wurde, und alles andere (db-Verbindung, Authentifizierung, etc ...) funktioniert einwandfrei, außer dass nichts in die Protokolldatei geschrieben wird. Andere ähnliche Anwendungen haben keine Problemprotokollierung.Log4J protokolliert nichts

Ich habe die WebSphere-Konsole beim Start der Anwendung angeschaut und dort sind keine Fehler, die darauf hinweisen könnten, warum Log4J nicht protokolliert.

Ich erwähnte dies zu einem anderen Entwickler (wer einmal an dieser Anwendung gearbeitet hat, aber nicht für eine Weile und ist veralteter als ich bin), der bemerkte, dass es sehr seltsames Verhalten war, aber hatte keine Ahnung warum protokolliert möglicherweise nicht und meldet keine Fehler.

Ich habe über die Konfigurationsdatei und Eigenschaften Datei und alles sieht OK. Ich vermute, dass Log4J nie die log4j.xml liest, aber ich bin mir nicht sicher. Es ist schon eine Weile her, seit ich mit Log4J gearbeitet habe - hat jemand ein paar gute Tipps zur Fehlersuche bei dieser Art von Problem?

PS: Es gibt Instanzen dieser Anwendung, die auf verschiedenen Test-/QA-/Prod-Servern bereitgestellt werden, und diese Instanzen protokollieren alle ordnungsgemäß. Es ist nur auf lokalen Arbeitsstationen, die Protokollierung scheint stillschweigend zu versagen.


Update: So scheint es ein Problem mit dem Weg, um die Anwendung bereitgestellt wird. Ich habe den Classloader-Modus auf "Parent Last" geändert und ich kann sehen, dass die Log4J-Datei jetzt zumindest gelesen wird. Und die erste Aktion, die ich versuche, löst einen ClassNotFoundException aus, der besagt, dass org.apache.commons.logging.impl.Log4jFactory nicht gefunden werden kann.


2. Update: Ich habe etwas Fremden bemerkt ... Die Anwendung hat zwei WAR-Projekte - einer von ihnen ist für die Benutzeroberfläche und die andere ist für einige Web-Services. Das Projekt, das für die UI ist, ist erfolgreich Protokollierung seiner Vorgänge in der Protokolldatei. Das Web-Service-Projekt ist das, das mit der ClassNotFoundException fehlschlägt. Beide haben commons-logging.jar als JavaEE-Modulabhängigkeit aufgelistet, und keine von ihnen hat eine projektspezifische Protokollierungskonfiguration (alle Konfigurationsdateien befinden sich in einem Resources-Projekt). Ein wichtiger Unterschied ist, dass dieses UI-Projekt einige andere Inhouse-Frameworks enthält (vorkompiliert als JARs), die bereits die notwendigen Protokollierungskonfigurationen enthalten. Vielleicht liegt das an dem Unterschied.

Ich habe auch versucht, die Antwort zu verwenden (eine Datei mit dem Namen org.apache.commons.logging.LogFactory in den META-INF/services mit einer Zeile, die enthält: "org.apache.commons.logging.impl.Log4jFactory") von dieser Frage: Websphere all logs are going to SystemOut.log aber es schien nicht zu helfen.

+0

Welche Art von Logger-Instanz ist das? Wie in RollingFileAppender – Woot4Moo

+0

@ Woot4Moo: Es ist ein FileAppender. – FrustratedWithFormsDesigner

+0

Können Sie Ihre Konfigurationsdatei posten? Sind die Einstellungen in allen Umgebungen identisch? – evanwong

Antwort

2

Die letzte Sache, die ich änderte, die schließlich Logging richtig funktionierte, änderte den Classloader-Modus zu "PARENT_FIRST" und WAR Classloader-Richtlinie zu "Application". Die anfängliche Standardkonfiguration war "PARENT_FIRST"/"Module". Ich änderte es in "PARENT_LAST"/"Application" auf den Rat eines Kollegen, der sagt, Logging funktioniert gut für sie und das ist die einzige Änderung, die sie machen müssen, wenn sie eine neue Sandbox für diese Anwendung erstellen. Ich bin mir nicht sicher, warum ich mit "PARENT_FIRST"/"Application" gehen musste, aber zumindest funktioniert es jetzt.


UPDATE:

Ich habe versucht, einen neuen Arbeitsbereich einrichten und ich hatte das gleiche Problem. Es stellt sich heraus, dass Sie "PARENT_FIRST"/"Application" UND eine Datei namens org.apache.commons.logging.LogFactory in den META-INF/services mit einer Zeile benötigen, die folgendes enthält: "org.apache.commons.logging.impl.Log4jFactory" . Wenn die Datei nicht vorhanden ist, schlägt die Protokollierung fehl (normalerweise mit einer Meldung, dass ein Log4J nicht gefunden werden kann).

0

Ich weiß, dieses Symptom nicht Ihr genau das gleiche ist, aber es gibt bekannte Probleme mit log4j, wenn Ihre Anwendung (oder alles, was es verwendet) verwendet Commons Logging. Sehen Sie, ob this question/answer relevant ist.

0

nicht in der Lage, Protokolldatei zu erstellen, habe ich logback.xml Datei im Frühjahr Webservice-Anwendung verwendet und in Websphere-Server bereitgestellt ... Aber wenn ich log4j.properties-Datei verwendet wird, erstellt es Protokolldatei. Ich habe

<file>C:/abc/myLogFile.log</file> 
<append>true</append> 
<encoder> 
    <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern> 
</encoder></appender> 

`

Abhängigkeit richtige Abhängigkeit richtige für log4j und slf4j .. logback.xml Datei gegeben:

<dependency> 
    <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
0

Ich hatte ein Problem, wo log4j nicht zeigte irgendetwas in einem meiner Projekte. Es stellte sich heraus, dass ich ein führendes Leerzeichen im Klassennamen in der Datei log4j2.xml hinzugefügt hatte. Log4j führt eine Wörterbuchsuche nach Klassennamen durch. Daher würde jedes führende oder nachgestellte Leerzeichen im Klassennamen diesen bestimmten Eintrag ungültig machen.