# Logging mit log4j



## RaoulDuke (5. Jul 2006)

Hallo,

ich komm mit log4j nicht so ganz zurecht, ich benutze es in einer Webapplikation auf einem Tomcat, die log4j Konfiguration sieht wie folgt aus:


```
log4j.rootCategory=ERROR, dest1
log4j.appender.dest1=org.apache.log4j.ConsoleAppender
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
log4j.appender.dest1.layout.ConversionPattern=%-5p %d %c: %m%n
```

Logausgaben erzeuge ich wie folgt:

Logger.getLogger(this.getClass().getName()).error("Blahblahblah");

Schön und gut, allerdings schreib ich momentan noch jede Meldung als Error raus, weil wenn ich in der Konfiguration den Filter auf z.B. DEBUG stelle dann haut mir der Tomcat und diverse andere Dinge auch Seitenweise Debug Output raus den ich garnicht sehen will.

Wie krigt man das denn sinnvoll unterteilt? Ich will eigentlich nur meine Logausgaben sehen und auch wählen können ob ich Debug Output ausgegeben bekomme oder nur Fehler.


----------



## foobar (5. Jul 2006)

Setz den Rootlogger auf WARN oder ERROR und hol dir nur die Logausgaben aus den Packages/Klassen die dich gerade interessieren.

```
log4j.logger.mypackage.MyClass=DEBUG, dest1
```
Gibt alle Ausgaben der Klasse MyClass au der Konsole aus.



> Logger.getLogger(this.getClass().getName()).error("Blahblahblah");


Mach das doch so:


```
Logger logger = LOgger.getLogger(getClass());
....
logger.debug("some debugging " + myVar);
```


----------



## RaoulDuke (5. Jul 2006)

Hmm, ok. Das hat dann aber den Nachteil das ich immer explizit für einzelne Klassen das Loggen von Debug Informationen aktivieren muss. Könnte man nicht irgendwie sagen mypackage.* auf Debug?


----------



## foobar (5. Jul 2006)

RaoulDuke hat gesagt.:
			
		

> Hmm, ok. Das hat dann aber den Nachteil das ich immer explizit für einzelne Klassen das Loggen von Debug Informationen aktivieren muss. Könnte man nicht irgendwie sagen mypackage.* auf Debug?


Klar, du kannst auch einfach ein Package angeben ohne den Stern am Ende.


----------



## RaoulDuke (5. Jul 2006)

Ah, fein, dann muss ich das nicht für alle Klassen einzeln machen.


----------



## RaoulDuke (5. Jul 2006)

Eine kleine Frage fällt mir zu dem Thema noch ein:

So sieht das Loggen natürlich theoretisch schöner aus:


```
Logger logger = LOgger.getLogger(getClass());
....
logger.debug("some debugging " + myVar);
```

Allerdings bin ich bissl faul und hab überlegt,ob es nicht gehen würde, dass jedes meiner Objekte sich im Konstruktor einen Logger erzeugt/holt und den in jeder Methode anspricht. Dann müsste ich nicht in jeder Methode die Zeile "Logger logger = LOgger.getLogger(getClass());" eintragen. 

Vermutlich wäre diese Lösung aber Speicherverschwenung und evtl. auch nicht ganz Threadsafe, oder?


----------



## AlArenal (5. Jul 2006)

Der empfohlene Weg (müsste so auch im Tutorial stehen) ist, eine statische Klassen-Variable draus zu machen. So hast du nur noch eine Logger-Instanz pro Klasse und nicht mehr zig Logger-Instanzen pro Klassen-Instanz, inkl. der Performance Penalty durch das ständige erzeugen und wegräumen von Logger-Instanzen.


----------



## RaoulDuke (5. Jul 2006)

Oh, öhmm, ok, ich hätt mal besser in Google direkt gesucht, das findet man ja direkt im ersten Ergebniss. 

Danke


----------



## RaoulDuke (6. Jul 2006)

Moin nochmal,

mittlerweile funktionierts fast so wie ich will, ich konnte die Ausgaben meiner Klassen in eine Logdatei umleiten. Allerdings fällt mir gerade auf das trotz der Konfiguration:

log4j.rootCategory=ERROR, dest1

auf der der Tomcat Konsole alle meine Debug und Info Messages angezeigt werden.


----------

