Frage

Warum man eines der folgenden Pakete anstelle des anderen benutzen würde?

  • Java Logging
  • Commons Logging
  • Log4j
  • SLF4J
  • Logback
War es hilfreich?

Lösung

In chronologischer Reihenfolge von api Apperance (soweit ich weiß):

  • Log4j, weil die meisten jeder benutzt es (nach meiner Erfahrung)
  • Commons Logging, da Open-Source-Projekte, die sie verwenden (so können sie integrieren mit dem, was Logging-Framework ist in der integrierten Lösung verwendet wird); insbesondere dann gültig, wenn Sie andere Pakete sind verlassen eine API / Framework-/ OSS und Sie auf die Commons Logging verwenden.
  • Commons Logging, weil Sie nicht wollen, zu „sperren“ auf eine bestimmte Logging-Framework (so stattdessen Sie sperren, was Commons Logging Sie stattdessen gibt) - Ich glaube nicht, es sinnvoll ist, um diesen Punkt zu entscheiden, mit wie der Grund.
  • Java-Protokollierung, weil Sie nicht wollen, in einem extra Glas hinzuzufügen.
  • SLF4J weil es neuer als Commons Logging und parametriert Protokollierung lautet:

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 weil es neuer als log4j und wieder unterstützt parametrisierte Protokollierung, wie es implementiert SLF4J direkt
  • SLF4J / Logback, weil sie von dem gleichen Mann geschrieben, die log4j hat, so ist er machte es besser (nach Ken G -. dank Es scheint zu passen, wenn unter suchen, um ihre frühere Nachrichten Beiträge )
  • SLF4J, weil sie auch einen log4j Adapter veröffentlichen, so dass Sie müssen nicht „-Schalter out“ log4j in älterem Code - nur machen log4j.properties verwenden SLF4J und es ist Konfiguration

Andere Tipps

Ich finde in Java Anmeldung zu verwirrend, widersprüchlich, schlecht dokumentiert, und vor allem planlos. Darüber hinaus gibt es eine riesige Menge an Ähnlichkeit zwischen diesem Logging Frameworks, was zu Doppelarbeit und Verwirrung, was die Protokollierung Umgebung, die Sie tatsächlich in sind. Insbesondere dann, wenn Sie in einem schwer Java Web Application Stack arbeiten, sind Sie oft in mehrere Logging-Umgebungen zu einer Zeit; (Z wintern kann log4j verwenden, und tomcat java.util.logging). Apache commons soll verschiedene Logging Frameworks zu überbrücken, aber wirklich kommt noch hinzu, mehr Komplexität. Wenn Sie nicht über diese vor der Zeit wissen, ist es äußerst verwirrend. Warum drucken meine Log-Meldungen auf der Konsole nicht aus, usw.? Ohh, weil ich bin auf der Suche an den Tomcat-Protokollen und nicht log4j. Hinzufügen noch eine weitere Ebene der Komplexität, kann der Anwendungsserver die globale Protokollierung Konfigurationen haben, die nicht lokale Konfigurationen für eine bestimmte Web-Anwendung erkennen können. Schließlich sind alle diese Anmeldung Frameworks viel zu kompliziert. Logging in Java war ein unorganisierten Chaos verlassen Entwickler wie mich frustriert und verwirrt.

Frühe Versionen von Java haben nicht ein eingebaute im Rahmen Protokollierung zu diesem Szenario führen.

Es ist ein wichtiger Punkt, der nicht bereits erwähnt wurde:

SLF4J (und beide Logback und LOG4J als Logging-Backend) haben Unterstützung für einen so Mapped Diagnostic Kontext aufgerufen (MDC finden Sie unter javadoc und Dokumentation ).

Dies ist im Wesentlichen eine lokale Thread-Map , die Sie zusätzliche Kontextinformationen zu Ihrem Protokolliervorgangs hinzufügen können. Der aktuelle Zustand des MDC zu jedem Ereignis verbunden ist.

Dies kann unglaublich nützlich sein, wenn man Sachen wie den Benutzernamen und die URL der Anfrage (im Falle einer Webapp) hineingesteckt. Dies kann automatisch unter Verwendung eines Filters, beispielsweise durchgeführt werden.

Siehe auch Antworten auf die Frage Was sind die besten Praktiken einen Fehler zu protokollieren , vor allem:

  • Es gibt einige mögliche Classloading Probleme mit Commons Logging.

  • Log4J und SLF4J wurden entwickelt von     die gleiche Person, Lernen aus     Probleme mit Log4J in der Praxis gefunden.

In unserer Firma Projekt verwenden wir LOG4J und es ist sehr einfach zu bedienen wie Stephen in seinem Beispiel zeigte. Wir haben auch unsere eigene Musterklassen für LOG4J geschrieben, so dass Sie Ihre eigene Ausgabedatei Schemas erstellen können. Sie können beschreiben, wie Sie Ihre Log-Datei aussehen sollte. Es ist möglich, die ursprüngliche log4j Klassen zu verbessern.

Alle LOG4J Eigenschaften, die Sie in einer Datei log4j.properties ändern können, so können Sie verschiedene Dateien für verschiedene Projekte verwenden können.

Java-Protokollierung nicht mein favorit, aber dies könnte sein, weil ich log4j von Anfang an verwenden.

Die Commons Logging Überblick den Grund für ihre Existenz gibt: von Bibliothekscode anmelden, wenn Sie haben keine Kontrolle über das zugrunde liegende Logging-Framework. Sehr wichtig für die verschiedene Apache-Projekte, die in Außenanwendungen verknüpft werden. Vielleicht nicht so wichtig für die internen IT-Projekte, in denen Sie die volle Kontrolle haben.

Das heißt, ich Commons Logging schreiben, wie viele der anderen Entwickler die ich kenne. Der Grund dafür ist geistiges Gepäck zu minimieren: Sie Projekte oder Aufträge ändern können, und nicht einen neuen Rahmen lernen müssen (vorausgesetzt, das neue Job / Projekt CL auch verwendet, und / oder Sie können sie überzeugen, um es zu bewegen)

Außerdem gibt es einen gewissen Wert auf Ihre eigenen Wrapper zu schaffen um, was Rahmen Sie verwenden. Wie beschrieben hier , Ich mag ein LogWrapper Objekt verwenden benutzerdefinierte bieten stringification (wichtig) und die visuelle Unordnung der Logging-Anweisungen minimieren (weniger wichtig).

Generell würde ich mit Log4J Standard.

Ich würde verwenden Java Logging, wenn ich nicht eine Abhängigkeit von Java 1.4 hatte nichts, aber ich würde immer noch Log4J bevorzugt einsetzen.

würde ich Commons Logging, wenn ich etwas zu verbessern, die bereits daran.

Ich würde vorschlagen, eine dünne Protokollierung Fassade zu schaffen, die zu einem des Logging-Frameworks schreiben können, bei denen die Wahl des Träger Motors so ziemlich ein strittiger Punkt werden zeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top