Vermeiden Sie printStackTrace (); Verwenden Sie stattdessen einen Logger-Aufruf

Antworten:

137

Es bedeutet, dass Sie ein Protokollierungsframework wie verwenden sollten oder und anstatt Ausnahmen direkt zu drucken:

e.printStackTrace();

Sie sollten sie mit der API dieses Frameworks protokollieren:

log.error("Ops!", e);

Protokollierungsframeworks bieten Ihnen viel Flexibilität. Sie können beispielsweise auswählen, ob Sie sich bei einer Konsole oder einer Datei anmelden möchten, oder einige Nachrichten überspringen, wenn Sie feststellen, dass sie in einer bestimmten Umgebung nicht mehr relevant sind.

Tomasz Nurkiewicz
quelle
39

Wenn Sie printStackTrace()eine Ausnahme aufrufen, wird in die Ablaufverfolgung geschrieben System.errund es ist schwierig, sie an eine andere Stelle weiterzuleiten (oder zu filtern). Stattdessen wird empfohlen, ein Protokollierungsframework (oder einen Wrapper für mehrere Protokollierungsframeworks wie Apache Commons Logging) zu verwenden und die Ausnahme mithilfe dieses Frameworks zu protokollieren (z logger.error("some exception message", e). B. ).

Auf diese Weise können Sie:

  • Schreiben Sie die Protokollanweisung gleichzeitig an verschiedene Speicherorte, z. B. in die Konsole und in eine Datei
  • Filtern Sie die Protokollanweisungen nach Schweregrad (Fehler, Warnung, Info, Debug usw.) und Herkunft (normalerweise paket- oder klassenbasiert).
  • Einfluss auf das Protokollformat haben, ohne den Code ändern zu müssen
  • etc.
Thomas
quelle
17

Ein Produktionsqualitätsprogramm sollte eine der vielen Protokollierungsalternativen (z. B. log4j, logback, java.util.logging) verwenden, um Fehler und andere Diagnosen zu melden. Dies hat eine Reihe von Vorteilen:

  • Protokollnachrichten werden an einen konfigurierbaren Speicherort gesendet.
  • Der Endbenutzer sieht die Nachrichten nur, wenn Sie die Protokollierung so konfigurieren, dass er dies tut.
  • Sie können verschiedene Protokollierer und Protokollierungsstufen usw. verwenden, um zu steuern, wie wenig oder viel Protokollierung aufgezeichnet wird.
  • Sie können verschiedene Appender-Formate verwenden, um zu steuern, wie die Protokollierung aussieht.
  • Sie können die Protokollierungsausgabe einfach in ein größeres Überwachungs- / Protokollierungsframework einbinden.
  • All dies kann ohne Änderung Ihres Codes durchgeführt werden. dh durch Bearbeiten der Protokollierungskonfigurationsdatei der bereitgestellten Anwendung.

Wenn Sie dagegen nur printStackTrace verwenden, hat der Bereitsteller / Endbenutzer nur wenig oder gar keine Kontrolle, und Protokollierungsnachrichten können unter unangemessenen Umständen entweder verloren gehen oder dem Endbenutzer angezeigt werden. (Und nichts erschreckt einen schüchternen Benutzer mehr als eine zufällige Stapelverfolgung.)

Stephen C.
quelle
5

In Simple ist e.printStackTrace () keine gute Vorgehensweise, da nur die Stapelverfolgung als Standardfehler ausgedruckt wird. Aus diesem Grund können Sie nicht wirklich steuern, wohin diese Ausgabe geht.

Sandip S.
quelle
0

Fast jedes Protokollierungsframework bietet eine Methode, mit der wir das Throwable-Objekt zusammen mit einer Nachricht übergeben können. Mögen:

public trace(Marker marker, String msg, Throwable t);

Sie drucken die Stapelspur des Wurfobjekts.

abhi shukla
quelle
Dies beantwortet die Frage nicht.
Stephen C
-1

Sprechen wir über das Unternehmenskonzept. Log bietet Ihnen flexible Ebenen (siehe Unterschied zwischen logger.info und logger.debug ). Unterschiedliche Personen möchten unterschiedliche Ebenen sehen, z. B. QAs, Entwickler und Geschäftsleute. Aber e.printStackTrace () druckt alles aus. Wenn diese Methode aufgerufen wird, wird derselbe Fehler möglicherweise mehrmals gedruckt. Dann sind die Devops- oder Tech-Ops-Mitarbeiter in Ihrem Unternehmen möglicherweise verrückt, weil sie dieselben Fehlererinnerungen erhalten. Ich denke, ein besserer Ersatz könnte sein. log.error("errors happend in XXX", e) Dies druckt auch ganze Informationen aus, die leicht zu lesen sind als e.printStackTrace ()

Qiyu Zhang
quelle
-3

Der Hauptgrund ist, dass Proguard Protokollaufrufe aus der Produktion entfernen würde. Denn durch Protokollieren oder Drucken von StackTrace ist es möglich, sie (Informationen im Stack-Trace oder im Protokoll) im Android-Telefon anzuzeigen, beispielsweise durch die Anwendung Logcat Reader. Damit es eine schlechte Praxis für die Sicherheit ist. Außerdem greifen wir während der Produktion nicht auf sie zu. Es ist besser, sie aus der Produktion zu entfernen. Da ProGuard alle Log-Aufrufe entfernt, die nicht stackTrace sind, ist es besser, Log-in-Catch-Blöcke zu verwenden und sie von Proguard aus der Produktion entfernen zu lassen.

Amirhossein Hashemi
quelle