log4j, root logger logt nur FATAL?

Hallo,

ich habe etwas Probleme mit der Vererbung der Logger bzw. insbesondere dem root logger und der korrekten Ausgabe:

Mein Logger ist so definiert:
Java:
package SWSoft.Application.JOpus.gui;

import org.apache.log4j.Logger;
...

public class ElemMP3P extends ElemTabPage implements MouseListener, ActionListener,
		RefreshListener, TimerCallback {
	private static final Logger logger = Logger.getLogger(ElemMP3P.class);

Zum einkreisen des Problems habe ich irgendwo diese Zeilen im Code:
Java:
logger.fatal( "...  switchTitle = " + switchTitle );
logger.warn ("...  switchTitle = " + switchTitle );
logger.debug( "...  switchTitle = " + switchTitle );

Und so sieht meine XML Konfiguration aus:
[XML]
<logger name="SWSoft.Application.JOpus.gui.ElemMP3P">
<level value="all" />
<appender-ref ref="console" />
<appender-ref ref="logFile"/>
</logger>
<root>
<level value="all"/>
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</root>
[/XML]

Den separaten Logger für die Klasse habe ich auch schon rausgeworfen, aber das Problem bleibt: Ich bekomme immer genau eine Zeile, wenn der oben gezeigte Quellcode durchlaufen wird, FATAL wird geloggt, die anderen nicht.

Was habe ich übersehen???

Viele Grüße,
Stephan
 
Hi,
ich bin nicht sicher ob ich alles richtig verstanden habe weil du den root-logger nicht explizit verwendest ich hab aber einfach mal ein schnelles Beispiel geschrieben und poste dir den Output vielleicht hilfts ja was, wenn was ned geht wie du es erwartest dann sag bescheid.

Java:
package logtest;

import org.apache.log4j.Logger;

public class LogTest {
	
	private Logger	rootLogger	= Logger.getRootLogger();
	private Logger	classLogger	= Logger.getLogger(LogTest.class);
	
	public LogTest() {
		
		this.rootLogger.fatal("rootLogger fatal");
		this.rootLogger.warn("rootLogger warn");
		this.rootLogger.debug("rootLogger debug");
		
		this.classLogger.fatal("classLogger fatal");
		this.classLogger.warn("classLogger warn");
		this.classLogger.debug("classLogger debug");
		
	}
	
	public static void main(String[] args) {
		new LogTest();
	}
	
}

[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
</layout>
</appender>

<logger name="logtest.LogTest">
<level value="warn"/>
</logger>

<root>
<level value="all" />
<appender-ref ref="console" />
</root>

</log4j:configuration>[/XML]

Code:
12:29:25,759 FATAL root:12 - rootLogger fatal
12:29:25,760  WARN root:13 - rootLogger warn
12:29:25,760 DEBUG root:14 - rootLogger debug
12:29:25,760 FATAL LogTest:16 - classLogger fatal
12:29:25,760  WARN LogTest:17 - classLogger warn

Liebe Grüße
Hemeroc

EDIT: getestet hab ich das mit folgender log4j-Version: log4j-1.2.16.jar
 
Hallo, ja, das ginge wahrscheinlich, ich habe noch andere Klassen, die auch einen eigenen Logger und eine eigene Konfiguration dafür bekommen, das klappt gut. Aber hier will ich explizit, dass der Logger selbst NICHT explizit konfiguriert wird, sondern der soll auf die rootlogger Konfiguration zurückgreifen. Das sollte er ja per default tun, tut er aber nicht, soweit ich das feststellen kann...
 
Wenn ich das

[XML]<logger name="logtest.LogTest">
<level value="warn"/>
</logger>
[/XML]

wegnehme dann arbeitet mein Logger so wie im root-logger konfiguriert du kannst auch auf Package ebene konfigurieren wenn du das möchtest.
 
Tja, das habe ich befürchtet, aber warum tut es das bei mir dann nicht??? Wie gesagt, die warn- und debug Messages aus meinem Beispiel (mittleres Fragment) sehe ich nie, warum nicht?!?
 
Kannst du mir mal den kompletten Code posten?
Inklusive dem genauen config-File und wie er heißt und auch was für eine log4j Version du verwendest, dann versuch ichs mal bei mir zu rekonstruieren.
LG
 
Hi, alle Klassen zusammen sind 97, dazu kommen noch einige Konfigurationsfiles plus jars. Ist also mittlerweile recht groß gewachsen... Und es hat sich auch gerade erübrigt; als ich überlegte, wie ich das Ganze in einer Klasse isolieren kann ist mir etwas aufgefallen. In der Tat gab es ein weiteres Feld 'logger' welches das, was ich nutzen wollte, verdeckt hat. Gestern hab ich den ganzen Tag draufgeschaut, rechts rum gedreht, links rum gedreht, nix gesehen. Naja, das haben wir wohl alle beim entwickeln schon mal erlebt, oder? Trotzdem danke für die Hilfe, letztlich hat es mich ja auf die Lösung gebracht.

Viele Grüße,
Stephan
 
Hmmm, hab ich nicht explizit nach geschaut, aber ich denke das ist ein ganz normaler Fall - ein privates Feld der Klasse war durch ein Aufrufargument der Methode verdeckt...

Stephan
 
Das ist todsicher eine Warnung 😉

Warnungen sollte man eben nicht ignorieren, sind nicht umsonst da.
 

Zurück
Oben