Logging mit log4j

Status
Nicht offen für weitere Antworten.

RaoulDuke

Bekanntes Mitglied
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:

Code:
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

Top Contributor
Setz den Rootlogger auf WARN oder ERROR und hol dir nur die Logausgaben aus den Packages/Klassen die dich gerade interessieren.
Code:
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:

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

RaoulDuke

Bekanntes Mitglied
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

Top Contributor
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

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

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

Code:
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

Top Contributor
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

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

Danke :)
 

RaoulDuke

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben