Log4j in jeder Klasse definieren?

Tom299

Bekanntes Mitglied
Hi,

ich hab in meinem Projekt Log4j testweise eingebaut (in 2 Klassen). Dabei mußte ich in beiden Klassen den Logger jeweils definieren:
Code:
private static final Logger logger = Logger.getLogger(Start.class);

Wenn ich jetzt 50 Klassen und mehr habe, die loggen sollen, muß ich da wirklich in jeder Klasse den Logger separat definieren? Ist es nicht möglich, den Logger in einer zentralen Klassen public static zu machen?
Ich hab auch schon sowas versucht, das Problem bei mir ist dann, daß der Logger immer bei der Ausgabe die Klasse angibt, für die er definiert wurde (also z.B. hier die Klasse Start). Wenn ich aber in der Klasse Person den gleichen Logger benutze, steht in der Ausgabe dann aber z.B. Start:42 obwohl es Person:42 sein müßte.

Wie kann man das lösen?
 

Maggot

Bekanntes Mitglied
Du kannst das nur lösen indem du in jeder Klasse separat den Logger definierst. Ich arbeite in der Arbeit an Projekten mit mehreren 1000 Klassen und überall wo der Logger benötigt wird, ist er in der Klasse separat definiert.
 

InfectedBytes

Top Contributor
Grundsätzlich musst du den Logger für jede Klasse separat erstellen.
Wenn du deine Objekte jedoch von einer gemeinsamen Basisklasse erben lassen kannst, kannst du auch folgendes tun:
Java:
public abstract class Loggable {
	private static HashMap<Class<?>, Logger> logger = new HashMap<Class<?>, Logger>();

	public Loggable() {
		if (!logger.containsKey(this.getClass())) {
			logger.put(this.getClass(), Logger.getLogger(this.getClass()));
		}
	}

	protected Logger getLogger() {
		return logger.get(this.getClass());
	}
}

class MyClass extends Loggable {
	public void test() {
		getLogger(); // liefert einen logger für die Klasse MyClass
	}
}

Alle Objekte die nun von Loggable erben, haben automatisch zugriff auf einen Logger ihrer jeweiligen Klasse.
Ist zugegebener Maßen keine "schöne" Lösung, aber sie erspart einem viel Schreibarbeit.
Selbstverständlich sollte das nur fürs Debuggen genutzt werden, im finalen Produkt sollte das gar nicht auftauchen.

p.s.
Falls du Java 8 benutzt, kannst du das auch mit Interfaces und default implementierung lösen.
Java:
public interface Loggable {
	public static HashMap<Class<?>, Logger> logger = new HashMap<Class<?>, Logger>();

	public default Logger getLogger() {
		Logger log = logger.get(getClass());
		if (log == null) {
			log = Logger.getLogger(this.getClass());
			logger.put(getClass(), log);
		}
		return log;
	}
}
 
Zuletzt bearbeitet:

Tom299

Bekanntes Mitglied
Vielen Dank, da ich Java8 nutze hab ich das grad mal so übernommen und funktioniert wunderbar.

Frage: Warum sollte das nur im Debugging benutzt werden? Loggen ist doch für die Fehlersuche ein super Hilfsmittel
 

InfectedBytes

Top Contributor
Hab mal nachgesehen wie Logger.getLogger implementiert ist.
Den Code von oben kann man noch weiter vereinfachen:
Java:
public interface Loggable {
	public default Logger getLogger() {
		return Logger.getLogger(getClass());
	}
	//Außerdem kann man selbstverständlich shortcuts einbauen
	public default void debug(Object msg) {
		getLogget().debug(msg);
	}
}
 
Zuletzt bearbeitet:

Tom299

Bekanntes Mitglied
Danke, genauso hab ich es gemacht und noch die restlichen 4 Methoden ergänzt (info, warn, error, fatal).

Ich muß mir aber nochmal das neue Interface von Java8 ansehen, dachte es gäbe nur 1 default-Methode im Interface, zumindest hatte ich mir Lambda-Tutorials angesehen und da hab ich irgend sowas noch im Kopf, vielleicht bring ich aber auch was durcheinander :)
 

stg

Top Contributor
Falls CDI zur Verfügung steht könnte man auch einen eigenen Producer schreiben

Java:
public class LoggerProducer {  
    @Produces  public Logger produceLogger(InjectionPoint injectionPoint) {  
        return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());  
    }
}
 

KSG9|sebastian

Top Contributor
Logger in einer Map cachen? Das ist ja grässlich.
Von einer Klasse zu erben nur (!) um eine Zeile zu sparen..pfui.

Zudem bin ich der Meinung, dass ein Logger nicht mit getClass() geholt werden sollte. Bei der Logausgabe interessiert dich die relevante Klasse, Methode u.s.w. Wenn du eine Klassenhierarchie mit 10 Klassen hast und die oberste Klasse macht Logger.getLogger(getClass()) dann hast du keine Ahnung in welcher konkreten Klasse geloggt wird und du kannst dir in der Hierarchie die relevante Klasse suchen..oder es wird von einer anonymen inneren Klasse geloggt, dann gute Nacht...
 

KSG9|sebastian

Top Contributor
getClass() liefert dir die Klasse von der dein Objekt ist.

Folgende Hierarchie: A extends B, B extends C, C extends D

Klasse D macht nun Logger l = Logger.getLogger(getClass()). Jetzt loggst du in A, B und C mit l.info(".."). Dann siehst du in der Logausgabe als "Verursacher" des Logstatements immer nur "D", weil dein Objekt vom Typ D ist. Ob die Logausgabe aber innerhalb der Klasse A, B oder C gemacht wurde weißt du nicht - und das ist nicht gut. Damit suchst du wild durch die ganze Klassenhierarchie.

Und ja, log4j cached die Logger. Das ist der eine Grund, warum man selbst nicht noch dasselbe machen soll.
Zudem cached Log4j intelligent, threadsafe u.s.w. und diesen Mechanismus hebelst du unter Umständen durch eigenes Caching aus.

Eigene Caches sind allermeistens Müll, vor allem wenn sie aus ner HashMap bestehen und keine gescheite Eviction Policy u.s.w. besitzen...
 

InfectedBytes

Top Contributor
Stichwort dynamische Methodenbindung.
Probier es aus und du wirst sehen:
Java:
class A {
	Class<?> clazz;
	public A() {
		clazz = this.getClass();
	}
}

class B extends A {
	public B() {
		System.out.println(clazz.getName());//Ausgabe B und nicht A
	}
}

Den Cache hatte ich erst eingebaut, da ich nicht geprüft hatte ob Log4j selbst cached. Und außerdem war es nur einfacher Beispielcode, natürlich kümmert sich das Beispiel nicht darum.
Außerdem habe ich später ja noch geschrieben, dass das eigene Cachen nicht nötig ist.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
MiMa log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
B Log4J Pfad des Logfiles definieren Java Basics - Anfänger-Themen 6
O Wie Log4J - Ausgaben/Events auffangen?! Java Basics - Anfänger-Themen 3
S log4j in externer Library Java Basics - Anfänger-Themen 4
M xml log4j überschreiben für/in Java Klassen Java Basics - Anfänger-Themen 4
N wie *.class-Dateien mit log4j loggen? Java Basics - Anfänger-Themen 9
F Log4j - log4j:WARN No appenders could be found for logger Java Basics - Anfänger-Themen 1
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
0 Log4J Instanz erzeugen Java Basics - Anfänger-Themen 2
M Input/Output log4j mit properties datei Java Basics - Anfänger-Themen 6
T LOG4J Konfiguration Java Basics - Anfänger-Themen 5
W log4j "installieren" Java Basics - Anfänger-Themen 10
F ThreadId in Log4j Java Basics - Anfänger-Themen 4
M log4j Java Basics - Anfänger-Themen 11
H Log4J und Angabe eines Ordners Java Basics - Anfänger-Themen 5
A log4j - wie kann ich im Quellcode initialisieren statt in der properties-Datei? Java Basics - Anfänger-Themen 2
A log4j - Warum wird Methode getHeader 2x ausgeführt? Java Basics - Anfänger-Themen 2
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
G Probleme mit log4j Java Basics - Anfänger-Themen 2
M log4j design Java Basics - Anfänger-Themen 11
G log4j Java Basics - Anfänger-Themen 4
S LineNumberReader - bessere Lösung möglich? - Log4J Java Basics - Anfänger-Themen 9
G Kompletten Stacktrace mit Log4j ausgeben Java Basics - Anfänger-Themen 3
M logging mit log4j Java Basics - Anfänger-Themen 4
M log4j frage zu whitespaces Java Basics - Anfänger-Themen 2
G log4j Java Basics - Anfänger-Themen 3
H Log4J Pfad setzen Java Basics - Anfänger-Themen 2
M log4j Unterverzeichnis mit Datum , Timestamp in LogDateiname Java Basics - Anfänger-Themen 2
G Log4j? Java Basics - Anfänger-Themen 15
G Log4j notwendig oder nicht? Java Basics - Anfänger-Themen 16
J Log4j + Junit Java Basics - Anfänger-Themen 4
M log4j XML Konfigurationsdatei Java Basics - Anfänger-Themen 2
M "System.out" "System.err" bzw. log4j Java Basics - Anfänger-Themen 9
K log4j Java Basics - Anfänger-Themen 2
R log4j - Datum an Logdatei anhängen möglich? Java Basics - Anfänger-Themen 7
S log4j "Richtiges" Design Java Basics - Anfänger-Themen 4
B Log4J Anfänger sucht hilfe! Java Basics - Anfänger-Themen 4
N Log4J Problem Java Basics - Anfänger-Themen 4
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
B Erste Schritte Guice Injection nicht in jeder Klasse möglich Java Basics - Anfänger-Themen 2
G if Abfrage: Nicht jeder Fall berücksichtigt Java Basics - Anfänger-Themen 2
Xentox501 keyevent.VK_LEFT wird beim drücken jeder belibigen Taste aktiv. Java Basics - Anfänger-Themen 3
C Compiler-Fehler Wird eine if Bedingung nach einer for-Schleife nach jeder Iteration überprüft? Java Basics - Anfänger-Themen 1
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
L OOP Neues Objekt bei jeder Eingabe erstellen (Objekte speichern?) Java Basics - Anfänger-Themen 10
B Zweidimensionales Array Elemente jeder Spalte zählen Java Basics - Anfänger-Themen 9
V Vor jeder Multiplikation den linken Multiplikator abrunden Java Basics - Anfänger-Themen 4
K Regex - Jeder buchstabe nur einmal Java Basics - Anfänger-Themen 7
S JTabbedPane jeder Tab in einer eigenen java Datei? Java Basics - Anfänger-Themen 3
Binary.Coder Vor und nach jeder Codezeile etwas einfügen Java Basics - Anfänger-Themen 3
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
K JDBC - Typ Connection in jeder Klasse neu öffnen? Java Basics - Anfänger-Themen 4
K in jeder klasse SQLExceptions??? Java Basics - Anfänger-Themen 2
G HILFE!!! JEDER MONAT HAT 31 TAGE Java Basics - Anfänger-Themen 2
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Klassen Typ und Intitialisierungs-Klasse, wer bestimmt was? Java Basics - Anfänger-Themen 1
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Int an andere Klasse übergeben Java Basics - Anfänger-Themen 26
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
B Klasse "Character" Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
I Array Länge in Klasse festlegen Java Basics - Anfänger-Themen 1
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben