Java Logging vs Log4J [geschlossen]

134

Lohnt es sich immer noch, die log4j-Bibliothek zu einem Java 5-Projekt hinzuzufügen, nur um zu protokollieren? Sagen wir einige Ausnahmen zu einer Datei mit einigen netten Rollover-Einstellungen. Oder erledigt auch die Standardfunktion util.logging die Aufgabe?

Was denken Sie?

Okami
quelle
Unter stackoverflow.com/a/13144054/603516 finden Sie zahlreiche zu berücksichtigende Probleme beim Sperren von log4j 1.2.
Vadzim

Antworten:

115

Ich würde sagen, dass Sie mit util.logging für die von Ihnen beschriebenen Anforderungen wahrscheinlich gut zurechtkommen.

Einen guten Entscheidungsbaum finden Sie unter Log4j vs java.util.logging

Frage 1: Erwarten Sie einen Bedarf an einem der cleveren Handler, die Log4j hat, die JUL nicht hat, wie dem SMTPHandler, NTEventLogHandler oder einem der sehr praktischen FileHandler?

Frage 2: Möchten Sie das Format Ihrer Protokollausgabe häufig ändern? Benötigen Sie dazu eine einfache und flexible Möglichkeit? Mit anderen Worten, benötigen Sie das PatternLayout von Log4j?

Frage 3: Erwarten Sie einen eindeutigen Bedarf an der Möglichkeit, komplexe Protokollierungskonfigurationen in Ihren Anwendungen zu ändern, nachdem diese in einer Produktionsumgebung kompiliert und bereitgestellt wurden? Klingt Ihre Konfiguration ungefähr so: "Schwere Nachrichten von dieser Klasse werden per E-Mail an den Support-Mitarbeiter gesendet. Schwere Nachrichten von einer Untergruppe von Klassen werden bei einem Syslog-Deamon auf unserem Server protokolliert. Warnmeldungen von einer anderen Untergruppe von Klassen werden protokolliert." in eine Datei auf Netzwerklaufwerk A; und dann werden alle Nachrichten von überall in einer Datei auf Netzwerklaufwerk B protokolliert "? Und siehst du dich alle paar Tage daran arbeiten?

Wenn Sie eine der oben genannten Fragen mit Ja beantworten können, wählen Sie Log4j. Wenn Sie alle mit einem eindeutigen Nein beantworten, ist JUL mehr als ausreichend und bequemerweise bereits im SDK enthalten.

Trotzdem scheint heutzutage so ziemlich jedes Projekt einschließlich log4j zu enden, schon allein deshalb, weil es von einer anderen Bibliothek verwendet wird.

Matt Sheppard
quelle
1
Tolle Fragebogen-basierte Antwort. Jedem sein eigenes basierend auf den Bedürfnissen.
HopeKing
43

Ich empfehle Ihnen, die Simple Logging Facade für Java (SLF4J) zu verwenden. Es unterstützt verschiedene Anbieter, einschließlich Log4J, und kann als Ersatz für Apache Commons Logging verwendet werden.

Brian Matthews
quelle
6
Was ist los mit Commons Logging?
Bart van Heukelom
5
@Bart van Heukelom und Kommentar upvoters - lesen articles.qos.ch/thinkAgain.html
Stephen C
4
@ Stephen C: Danke für die Info, obwohl ich das vor einiger Zeit erfahren habe und jetzt SLF4J benutze, wann immer ich kann. (Mein Kommentar war übrigens eine echte Frage, keine konservative Bemerkung)
Bart van Heukelom
1
@Bart, Commons Logging verwendet die dynamische Erkennung des zu verwendenden Pakets. SLF4J verwendet (oder verwendet), um die Klassen im Backend überhaupt zu laden.
Thorbjørn Ravn Andersen
21

Log4j gibt es schon lange und es funktioniert sehr gut. Ich habe keine wissenschaftliche Studie, um dies zu belegen, aber basierend auf dem, was ich bei einer großen Anzahl von Kunden gesehen habe, ist es leicht das Protokollierungsframework, das ich mehr als jedes andere verwendet sehe. Es gibt es schon lange und es wurde nicht durch das Next Big Logging Framework ersetzt, das etwas aussagt.

Es ist kinderleicht einzurichten und die grundlegenden Appender (Ausgaben) zu erlernen. Es gibt eine ganze Reihe von Host-Appendern, einschließlich:

  1. ConsoleAppender
  2. DailyRollingFileAppender
  3. ExternallyRolledFileAppender
  4. FileAppender
  5. JDBCAppender
  6. JMSAppender
  7. NTEventLogAppender
  8. RollingFileAppender
  9. SMTPAppender
  10. SocketAppender
  11. SyslogAppender
  12. TelnetAppender
  13. WriterAppender

Plus andere. Es ist auch nicht schwierig, einen eigenen Appender zu schreiben. Darüber hinaus bietet jeder der Appender eine große Flexibilität, mit der Sie genau steuern können, was in Ihrem Protokoll ausgegeben wird.

Ein Hinweis: Ich hatte eine Reihe von Classloader-Problemen, als ich zusätzlich zu log4j die Apache-Commons-Protokollierung verwendete. Es war nur für eine bestimmte Anwendung, aber ich fand es einfacher, log4j allein zu verwenden, als die Flexibilität zu haben, die bei der Verwendung einer Abstraktionsschicht wie der Commons-Protokollierung geboten wird.

Weitere Informationen finden Sie in diesem Artikel :

Viel Glück!

Rydell
quelle
17

java.util.logging bietet ein umfassendes Protokollierungspaket ohne das Übergepäck, das einige der anderen zur Verfügung stellen.

Adam
quelle
5
Außerdem ist es standardmäßig enthalten und wird von Java selbst verwendet (Sie werden es also trotzdem haben!)
Hat BEENDEN - Anony-Mousse
7

log4j ist insgesamt ein viel schöneres Paket und hat einige der Probleme, die java.util.logging enthält, nicht. Ich würde zweitens sagen, dass die direkte Verwendung von log4j einfacher ist als die Verwendung der Commons-Protokollierung.

Will Sargent
quelle
3
Können Sie bitte genauer auf die Probleme eingehen, die java.util.logging hat?
Alkber
Sicher, wie der Aufwand bei der Protokollierung synchronisierter Methoden: siehe github.com/playframework/playframework/issues/6958 und bugs.openjdk.java.net/browse/JDK-8077846
Will Sargent
4

Ich empfehle, Apache Commmons Logging als Protokollierungsschnittstelle zu verwenden. Auf diese Weise haben Sie die Flexibilität, die Protokollierungsimplementierungen jederzeit zu wechseln, ohne dass Sie Codeänderungen vornehmen müssen.

Edmund Tay
quelle
3

Ich würde mit log4j gehen. Die Möglichkeiten mit log4j sind überhaupt nicht veraltet!

svrist
quelle