Sollten Sie sich aus dem Bibliothekscode anmelden?

38

Wenn ich eine Java-Bibliothek entwickle, ist es empfehlenswert, Protokollanweisungen aus dem Code der Bibliothek heraus auszugeben?

Durch die Protokollierung in der Bibliothek werden das Debuggen und die Fehlerbehebung transparenter. Andererseits mag ich es nicht, meinen Bibliothekscode mit Protokollanweisungen zu verunreinigen. Gibt es auch Auswirkungen auf die Leistung?

dänisch
quelle

Antworten:

33

Ja du solltest. Die Verwendung einer Protokollierungsfassade wie SLF4J bietet Ihnen Flexibilität, ohne Ihre Benutzer mit einem bestimmten Protokollierungsframework zu belasten.

Autoren von weit verbreiteten Komponenten und Bibliotheken verwenden möglicherweise Code für die SLF4J-Schnittstelle, um zu vermeiden, dass dem Endbenutzer der Komponente oder Bibliothek ein Protokollierungsframework auferlegt wird. Somit kann der Endbenutzer das gewünschte Protokollierungsframework zum Bereitstellungszeitpunkt auswählen, indem er die entsprechende slf4j-Bindung in den Klassenpfad einfügt. Diese kann später geändert werden, indem eine vorhandene Bindung durch eine andere im Klassenpfad ersetzt und die Anwendung neu gestartet wird. Dieser Ansatz hat sich als einfach und sehr robust erwiesen.

Wenn Ihre Benutzer keine SLF4J-JAR-Datei enthalten (aus dem Benutzerhandbuch ):

Wenn ab SLF4J Version 1.6.0 keine Bindung im Klassenpfad gefunden wird, verwendet slf4j-api standardmäßig eine Implementierung ohne Operation, bei der alle Protokollanforderungen verworfen werden.

Wenn Sie sich Sorgen über die Auswirkungen der Protokollierung auf die Leistung machen, lesen Sie diesen SLF4J-FAQ-Eintrag . Die Idee ist, dass Sie Parameter zum Protokollieren von Anweisungen bereitstellen, anstatt sie in eine Zeichenfolge einzufügen:

Die folgenden beiden Zeilen liefern genau die gleiche Ausgabe. Das zweite Formular übertrifft jedoch das erste Formular um einen Faktor von mindestens 30, wenn die Protokollierungsanweisung deaktiviert ist.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

Ist SLF4J noch eine Holzfassade?

SLF4J ist JCL konzeptionell sehr ähnlich. Als solches kann man sich noch eine andere Holzfassade vorstellen. SLF4J ist jedoch viel einfacher im Design und wahrscheinlich robuster. Kurz gesagt, SLF4J vermeidet die Probleme mit dem Klassenladeprogramm, die [Jakarta Commons Logging] plagen.

Mike Partridge
quelle
Gibt es eine gute Open-Source-Bibliothek, die sich innerhalb des Bibliothekscodes anmeldet, auf den Sie verweisen können? So können wir sehen, wie es gemacht wird?
user1870400
Das Spring-Framework ist eine ziemlich bekannte Java-Bibliothek, die dies ausführt. in ihrem Fall entschieden sie sich für JCL.
Mike Partridge
17

Ja , Sie sollten sich von Ihrem Bibliothekscode aus anmelden. Es hilft Ihnen nicht nur bei der Entwicklung, sondern wird auch den Benutzern der Bibliothek nützlich sein. Denken Sie daran, dass Sie die Protokollierungsstufen immer so einstellen können, dass nur die von Ihnen benötigten Protokollanweisungen angezeigt werden - und das können sie auch.

Vor kurzem habe ich Mybatis , ein Open-Source-ORM-Tool, verwendet. Ich habe ein Problem behoben, bei dem eine Abfrage, die meiner Meinung nach korrekt war, keine Ergebnisse lieferte. Es war eine parametrisierte Abfrage, und da Mybatis die Protokollierung im Bibliothekscode hat, konnte ich sie aktivieren und die aktuelle Abfrage anzeigen. Es war leicht zu erkennen, dass ich zwei Parameter vertauscht habe. Ohne Anmeldung in der Bibliothek hätte ich das Problem nicht annähernd so schnell finden können.

Michael K
quelle