Was ist los mit der Anmeldung in Java? [geschlossen]

117

Warum sollte man eines der folgenden Pakete anstelle des anderen verwenden?

  • Java-Protokollierung
  • Commons-Protokollierung
  • Log4j
  • SLF4j
  • Wieder anmelden
Loki
quelle
4
Möglicherweise möchten Sie stackoverflow.com/questions/873051 verwenden , um SLF4j mit Commons Logging zu vergleichen.
James McMahon
24
Warum zum Teufel hat Ceki 3 Protokollierungs-Frameworks erstellt !!! das ist Wahnsinn ...
mP.
6
@mP. - log4j war der erste, dann kam es zu Meinungsverschiedenheiten, und slf4j + logback wurde geschrieben. slf4j ist die API und protokolliert die Implementierung der API. Unabhängig von allem anderen ist slf4j äußerst nützlich.
Thorbjørn Ravn Andersen
3
Einzelheiten dazu, warum Ceki Gülcü SLF4J + Logback erstellt hat, finden Sie in der folgenden Devoxx-Diskussion: parleys.com/#st=5&id=1701
Bitek
Das Beste daran ist die slf4j-API, die hoffentlich die Protokollierungswelt vereinheitlichen wird. Ich denke, Logback hat bei Entwicklern noch keine kritische Masse erreicht.
Thorbjørn Ravn Andersen

Antworten:

86

In chronologischer Reihenfolge des Erscheinungsbilds (soweit ich weiß):

  • Log4j, weil es fast jeder benutzt (meiner Erfahrung nach)
  • Commons Logging, weil Open Source-Projekte es verwenden (damit sie sich in jedes Protokollierungsframework integrieren können, das in der integrierten Lösung verwendet wird); Dies gilt insbesondere dann, wenn Sie eine API / Framework / OSS sind und sich auf andere Pakete verlassen, die Commons Logging verwenden.
  • Commons-Protokollierung, weil Sie nicht an ein bestimmtes Protokollierungsframework "sperren" möchten (stattdessen sperren Sie stattdessen an das, was Ihnen die Commons-Protokollierung bietet) - Ich halte es nicht für sinnvoll, diesen Punkt als Grund zu verwenden.
  • Java-Protokollierung, da Sie kein zusätzliches Glas hinzufügen möchten.
  • SLF4j, weil es neuer als Commons Logging ist und parametrisierte Protokollierung bietet:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logback, da es neuer als log4j ist und erneut die parametrisierte Protokollierung unterstützt, da SLF4j direkt implementiert wird
  • SLF4j / Logback, weil es von demselben Typ geschrieben wurde, der log4j gemacht hat, also hat er es besser gemacht (laut Ken G - danke. Es scheint zu passen, wenn man sich ihre früheren Nachrichten ansieht ).
  • SLF4j, da sie auch einen log4j-Adapter veröffentlichen, sodass Sie log4j in älterem Code nicht "ausschalten" müssen - lassen Sie log4j.properties einfach SLF4j und dessen Konfiguration verwenden
Stephen
quelle
3
Soweit ich das beurteilen kann, ist die Idee hinter der Commons-Protokollierung, dass sie in Bibliotheken verwendet werden sollte. Auf diese Weise kann die Bibliothek immer dasselbe Protokollierungsframework (über die Commons-Protokollierung) verwenden, das die Hosting-Anwendung verwendet.
Joachim Sauer
Vielen Dank an Loki für die Frage. Ich weiß jetzt, dass ich log4j nicht mehr als Standardframework verwenden werde. SLF4j FTW! Vielen Dank auch an Ken G für den Hinweis, dass SLF4j vom selben Typ wie log4j geschrieben wurde
Stephen
3
Der Kommentar in Ihrem Codebeispiel ist nicht 100% korrekt. Die eigentliche Formatierung der Nachricht wird von Logback träge durchgeführt, sodass dies nur dann geschieht, wenn das Ereignis wirklich von einem Appender verarbeitet wird und der Appender die formatierte Nachricht benötigt - was beispielsweise bei einem SocketAppender nicht der Fall wäre, da das Ereignis mit serialisiert wird das unveränderte Nachrichtenmuster + die Argumente als Strings. Ich denke, es hängt nur davon ab, wie Sie "effektiv" definieren. Es würde sicherlich die gleiche Nachricht ausgeben (zumindest wenn Eintrag und Objekt gleich sind;)), also bitte verzeihen Sie mein Nitpicking.
Huxi
6
SLF4J ist eigentlich nur eine API, die auf anderen Protokollierungsframeworks aufbaut. Ähnlich dem Ziel von Commons Logging, aber meiner Erfahrung nach intuitiver.
James McMahon
36

Ich finde die Anmeldung in Java verwirrend, inkonsistent, schlecht dokumentiert und besonders zufällig. Darüber hinaus gibt es eine große Ähnlichkeit zwischen diesen Protokollierungsframeworks, was zu Doppelarbeit und Verwirrung darüber führt, in welcher Protokollierungsumgebung Sie sich tatsächlich befinden. Insbesondere wenn Sie in einem seriösen Java-Webanwendungsstapel arbeiten, befinden Sie sich häufig in mehrereProtokollieren von Umgebungen auf einmal; (z. B. kann der Ruhezustand log4j und tomcat java.util.logging verwenden). Apache Commons soll verschiedene Protokollierungsframeworks überbrücken, erhöht jedoch die Komplexität. Wenn Sie dies nicht im Voraus wissen, ist es äußerst verwirrend. Warum werden meine Protokollnachrichten nicht auf der Konsole usw. gedruckt? Ohh, weil ich mir die Tomcat-Protokolle ansehe und nicht log4j. Der Anwendungsserver verfügt möglicherweise über globale Protokollierungskonfigurationen, die lokale Konfigurationen für eine bestimmte Webanwendung möglicherweise nicht erkennen. Schließlich sind alle diese Protokollierungs-Frameworks viel zu kompliziert. Das Anmelden in Java war ein unorganisiertes Durcheinander, das Entwickler wie mich frustriert und verwirrt machte.

Frühere Java-Versionen verfügten nicht über ein integriertes Protokollierungsframework, das zu diesem Szenario führte.

Julien Chastang
quelle
19
Ist das eine Antwort? Es sieht eher aus wie ein Scherz.
Michael Myers
15
Tut mir leid. Es ist ein bisschen scherzhaft. Es ist aber auch eine überzeugende Antwort auf "Was ist los mit der Protokollierung in Java?". Kurz gesagt, die Antwort ist, dass es tief gebrochen ist.
Julien Chastang
1
Nun, es ist keine -1 Stimme wert; P Aber etwas, worüber man nachdenken sollte.
Guyumu
21
Die Probleme begannen, als Sun Java 1.4 tatsächlich java.util.logging hinzufügte. Zuvor war LOG4J gut etabliert und weit verbreitet. Danach mussten Wrapper sowohl LOG4J als auch java.util.logging unterstützen. Da jul im Java. * -Paket enthalten ist, kann es nicht durch Austauschen einer JAR ersetzt werden. Auf diese Weise überbrückt SLF4J die anderen Frameworks. Dies war wahrscheinlich die schlechteste Sun-Idee aller Zeiten ... und führte letztendlich zu der falschen Annahme, dass ein "guter Java-Bürger" Jul verwenden sollte.
Huxi
4
@Huxi, ich behaupte, dass die Kalender-API schlechter war. Zur Verteidigung von Sun war es nicht ihr Code, sondern kam von Taglient.
Thorbjørn Ravn Andersen
22

Es gibt einen wichtigen Punkt, der zuvor nicht erwähnt wurde:

SLF4J (und sowohl Logback als auch LOG4J als Protokollierungs-Backend) unterstützen einen sogenannten Mapped Diagnostic Context (MDC, siehe Javadoc und Dokumentation ).

Dies ist im Wesentlichen eine threadlokale Map <String, String>, mit der Sie Ihrem Protokollierungsereignis zusätzliche Kontextinformationen hinzufügen können. Der aktuelle Status des MDC ist jedem Ereignis zugeordnet.

Dies kann unglaublich nützlich sein, wenn Sie Dinge wie den Benutzernamen und die URL der Anfrage (im Falle einer Webanwendung) einfügen. Dies kann beispielsweise automatisch mit einem Filter erfolgen.

Huxi
quelle
2
Technisch gesehen handelt es sich um eine threadlokale Map <String, String>.
pdxleif
17

Siehe auch Antworten auf die Frage Was sind die besten Methoden, um einen Fehler zu protokollieren? , insbesondere:

  • Es gibt einige potenzielle Probleme beim Laden von Klassen mit Commons Logging.

  • Log4J und SLF4J wurden von derselben Person entwickelt und lernten aus Problemen, die in der Praxis mit Log4J aufgetreten sind.

Ken Gentle
quelle
4

In unserem Unternehmensprojekt verwenden wir LOG4j und es ist sehr einfach zu verwenden, wie Stephen in seinem Beispiel gezeigt hat. Wir haben auch eigene Musterklassen für LOG4j geschrieben, damit Sie Ihre eigenen Ausgabedateischemata erstellen können. Sie können beschreiben, wie Ihre Protokolldatei aussehen soll. Es ist möglich, die ursprünglichen log4j-Klassen zu erweitern.

Alle LOG4j-Eigenschaften, die Sie in einer log4j.properties-Datei ändern können, sodass Sie unterschiedliche Dateien für unterschiedliche Projekte verwenden können.

Java-Protokollierung ist nicht mein Favorit, aber das könnte daran liegen, dass ich log4j von Anfang an verwende.

Markus Lausberg
quelle
4

Die Commons-Protokollierungsübersicht gibt den Grund für ihre Existenz an: Protokollierung aus Bibliothekscode, wenn Sie keine Kontrolle über das zugrunde liegende Protokollierungsframework haben. Sehr wichtig für die verschiedenen Apache-Projekte, die mit externen Anwendungen verknüpft werden. Vielleicht nicht so wichtig für interne IT-Projekte, bei denen Sie die vollständige Kontrolle haben.

Trotzdem schreibe ich an Commons Logging, ebenso wie viele andere Entwickler, die ich kenne. Der Grund ist, das mentale Gepäck zu minimieren: Sie können Projekte oder Jobs ändern und müssen kein neues Framework erlernen (vorausgesetzt, der neue Job / das neue Projekt verwendet auch CL und / oder Sie können sie davon überzeugen, dorthin zu wechseln).

Es ist auch sinnvoll, eigene Wrapper für das von Ihnen verwendete Framework zu erstellen. Wie hier beschrieben , verwende ich gerne ein LogWrapper-Objekt, um eine benutzerdefinierte Zeichenfolge bereitzustellen (wichtig) und die visuelle Unordnung von Protokollierungsanweisungen zu minimieren (weniger wichtig).

kdgregory
quelle
1
Es gibt auch eine commons.logging => SLF4J-Brücke, mit der die gesamte CL-Protokollierung über SLF4J weitergeleitet werden kann. SLF4J unterstützt die Überbrückung von commons.logging, LOG4J und (etwas umständlich, aber so gut wie möglich) java.util.logging, sodass alle Protokolle in dem von Ihnen verwendeten SLF4J-Backend landen. Siehe slf4j.org/legacy.html Ich würde übrigens Logback verwenden, aber Sie könnten argumentieren, dass ich voreingenommen bin.
Huxi
2

Im Allgemeinen würde ich standardmäßig Log4J verwenden.

Ich würde Java Logging verwenden, wenn mir eine Abhängigkeit von Java 1.4 nichts ausmachen würde, aber ich würde weiterhin bevorzugt Log4J verwenden.

Ich würde Commons Logging verwenden, wenn ich etwas verbessern würde, das es bereits verwendet.

Michael Rutherfurd
quelle
Hat mir eine Abhängigkeit von 1.4 nichts ausgemacht ?? Sogar 1.4 hat das Ende seiner Lebensdauer erreicht.
Tom Hawtin - Tackline
2
@ Tom Er meint jdk1.4 + sei nicht albern.
mP.
Eigentlich habe ich kürzlich einige Arbeiten in einem System durchgeführt, das noch unter jdk 1.3 :-( lief, und es war vor weniger als zwei Jahren, als ich zuletzt ein jdk 1.2- System gewartet habe . Zu viele Orte aktualisieren nicht, es sei denn, sie haben es unbedingt zu, sie weigern sich nur, die Upgrades zu installieren.
Michael Rutherfurd
0

Ich würde vorschlagen, eine dünne Protokollierungsfassade zu erstellen, die in jedes der Protokollierungsframeworks schreiben kann. Ab diesem Zeitpunkt wird die Wahl der Backing-Engine zu einem strittigen Punkt.

Tsimon
quelle
2
Das ist es, was Commons Logging macht. Warum also das Rad neu erfinden? Es gibt auch einige Probleme, die Ihre Fassade lösen müsste, die die Commons-Protokollierung bereits tut.
James AN Stauffer
+1 Um dem Argument der allgemeinen Protokollierung entgegenzuwirken, verwenden einige Unternehmensanwendungen einen benutzerdefinierten Protokollierer. Es ist immer eine gute Idee, die zugrunde liegende Implementierung zu verbergen. Die "dünne" Hülle macht das Verpacken eines weiteren Glases überflüssig und ist nicht so viel wie eine Neuerfindung.
Questzen
1
Dies hat mich kürzlich gerettet, als wir unser Framework auf das Compact Framework (in .Net) portiert haben. Wenn wir fest codierte Abhängigkeiten von nLog hätten, wären wir geschraubt worden. Da wir diesen Ansatz verwendet haben, konnten wir einen Null-Logger einfügen und glücklich sein. Jemand
wählt
3
Eine existiert bereits - schauen Sie sich slf4j an. Es ist ein akzeptierter Thin Wrapper, mit dem Sie die Protokollierungsframeworks beim Start der Anwendung wechseln können, indem Sie die Jars im Laufzeitklassenpfad wechseln.
Deterb
1
Das Verstopfen hat seine eigene Art herauszufinden, welches Framework es verwenden wird - es ist nicht schön und eher verworren. Wie viele Protokollierungsframeworks hat Ceki erstellt? Man sollte immer danach streben, eine Ebene der Interdirektion zu platzieren und eine Implementierung auszublenden, selbst wenn sie durch Ihre eigene Protokollierung verstopft ist. Hinter den Kulissen können Sie dann jedes gewünschte F / W einstecken, wie von Travis erwähnt.
mP.