PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Woher kennt log4j die Codezeile?


Ganon
2010-06-22, 15:52:56
Heyho.

Wenn man log4j (oder slf4j mit log4j Provider) nutzt und einen Text an den Logger schickt, kann man sich ja sogar die Code-Zeile ausgeben lassen, an der das Problem bzw. der Log-Eintrag aufgetreten ist.

z.B.

15:43:12,475 - INFO - MainControl:217 - Hallo Welt


Der Aufruf ist recht simpel (hier slf4j):

LoggerFactory.getLogger(MainControl.class).info("Hallo Welt");


Die Frage ist jetzt nur, woher er diese Zeile weiß? Ich würde nämlich gerne 3rd-Party-Abhängigkeiten aus meinem Code größtenteils raushalten und eine Klasse schreiben die das Logging 1:1 an slf4j weiterleitet. Mein Versuch mit:


public static void log(Class<?> cl, String msg) {
LoggerFactory.getLogger(cl).info(msg);
};


Resultiert aber dann in:

15:43:12,475 - INFO - MainControl:16 - Hallo Welt


Weiß da zufällig jemand etwas darüber, bevor ich den Code von denen durchacker? :D

Danke :)

Coda
2010-06-22, 16:30:22
Thread.currentThread().getStackTrace() und dann StackTraceElement.getLineNumber()

Gohan
2010-06-22, 20:26:05
Muss da aber nicht ähnlich .NET eine Datei mit Bebug-Informationen dem Code beiliegen (bei .NET .pdb)?

Coda
2010-06-22, 20:30:16
Ne das ist schon in den Class-Files, aber optional: http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#22856

Aber ich kann mir nicht vorstellen, dass log4j das anders macht.

Ganon
2010-06-22, 22:56:47
Danke Coda :)

Ich hab jetzt speziell danach gesucht und ja, log4j macht es wirklich so. Kostet logischerweise auch viel Performance, aber naja, wenn die Anwendung gerade wegrotzt, dann ist das auch hinfällig :D

Jetzt kann ich, bei Bedarf, das auch einfach selbst raussuchen. Hab nämlich heute die Bibliothek logback gefunden, welche SLF4J direkt implementiert, womit man gar kein log4j o.ä. mehr braucht.