# ein log4j Verständnisproblem



## takidoso (10. November 2006)

Hallo und Halli,

ich verwende ein API welches mit dem log4j loggt. so weit so gut. Ich habe einiges gelesen darüber doch irgendwie kommt mir das Verhalten des Loggers merkwürdig vor, oder irgendwas mache ich falsch...
Ich habe das ganze mit einer Property-Datei konfigurriert und verschiedene Einstellungen auprobiert.
Ich habe meine zu loggene Klasse so wi es sich wohl gehört
mit 

```
static Logger logger = Logger.getLogger(SwiftSplitter.class);
```
versehen.
Genauso passiert es auch in den verschiedenen Klassen des verwendeten APIs

Maine main-methode nimmt die Konfiguartion vor mittels

```
PropertyConfigurator.configure("log4.propteries");
```

Ich hätte nun eigetnlich angenommen, dass meine Klasse und das API sich bezüglich selben verwendeten Properties würden sich die Ausgaben beider (der des APIs als auch meine) identisch verhalten, aber Pustekuchen, und ich weiß wirklich nicht was ich übersehen haben könnte.

eine meiner Varianten von log4.properties sieht wie folgt aus und zeigt das eigetnlich recht demonstrativ:

```
log4j.rootLogger=OFF, LALA

log4j.de.tai.swiftsplitting.SwiftSplitter = DEBUG
log4j.logger.net.sourceforge.wife.swift.SwiftParser2 = DEBUG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern = %-5p %F:%L %M() %m %n 

log4j.appender.LALA=org.apache.log4j.ConsoleAppender 
log4j.appender.LALA.layout=org.apache.log4j.PatternLayout 
log4j.appender.LALA.layout.ConversionPattern = %d{ISO8601} %-5p %F:%L %M() %m %n
```
Die herauspurzelnden logs zeigen hier komischerweise nur die des APIs (ich selbst habe in meiner Klasse ein debug gemacht") kommt wohl nicht raus weil rootLogger auf off steht.
aber warum kommt bitte dann was für das API raus (von WARN, INFO bis DBUG)? :suspekt: 

eine andere Variante ist 

```
log4j.rootLogger=OFF, LALA

log4j.de.tai.swiftsplitting.SwiftSplitter = DEBUG, CONSOLE
log4j.logger.net.sourceforge.wife.swift.SwiftParser2 = DEBUG, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern = %-5p %F:%L %M() %m %n 

log4j.appender.LALA=org.apache.log4j.ConsoleAppender 
log4j.appender.LALA.layout=org.apache.log4j.PatternLayout 
log4j.appender.LALA.layout.ConversionPattern = %d{ISO8601} %-5p %F:%L %M() %m %n
```
Ergebnis:
wie erwartet wird alles doppelt ausgegeben jede Zeile in dem einen als auch in dem anderen Apender-Format
Aber für meine Klasse immer noch nix zu sehen!  

Nun ändere ich mal als Spaß die Level in der routlogger angabe:

```
log4j.rootLogger=DEBUG, LALA

log4j.de.tai.swiftsplitting.SwiftSplitter = DEBUG, CONSOLE
log4j.logger.net.sourceforge.wife.swift.SwiftParser2 = DEBUG, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern = %-5p %F:%L %M() %m %n 

log4j.appender.LALA=org.apache.log4j.ConsoleAppender 
log4j.appender.LALA.layout=org.apache.log4j.PatternLayout 
log4j.appender.LALA.layout.ConversionPattern = %d{ISO8601} %-5p %F:%L %M() %m %n
```

und siehe da ich bekomem einen Eintrag anstelle eines weiteren wie es in der API-Klasse der Fall ist

hier die Ausgabe:
DEBUG ?:? consumeBlock() blockId: -1 
 2006-11-10 15:07:05,051 DEBUG ?:? consumeBlock() blockId: -1 
 INFO  ?:? consumeBlock() Unidentified block for buffer: "" you can safelfy ignore this if it is blank or empty, eg: no data 
 2006-11-10 15:07:05,051 INFO  ?:? consumeBlock() Unidentified block for buffer: "" you can safelfy ignore this if it is blank or empty, eg: no data 
 2006-11-10 15:07:05,051 DEBUG SwiftSplitter.java:231 main() Fertig 

hier wird offenbar nur der Apender von LALA für meine Klasse gesehen.
Anstelle dass auch das Format von CONSOLE einen 2. Eintag veranlasst.

;-]  ich schließe mal harscharf, dass irgendwas im verwendeten API doch noch anders ist als ich bisher bemerkt habe. Doch wo nach muss ich da suchen? Und wie bekomme ich meine Loggerverwendung auch so autark vom rootLogger hinbekomme wie das in dme API

kann mir jemand mit mehr lg4j erfahrung einen Tipp geben?

mit bestem Dank im Voraus

Takidoso


----------

