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

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer1305398

In meiner Anwendung führe ich meinen Code über PMD aus. Es zeigt mir diese Nachricht:

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

Was bedeutet das?

  • Siehe auch Wann ein Stacktrace für eine abgefangene Ausnahme protokolliert werden soll

    – Raedwald

    13. September 2019 um 13:04 Uhr

Benutzer-Avatar
Tomasz Nurkiewicz

Dies bedeutet, dass Sie ein Protokollierungsframework wie logback oder log4j verwenden sollten, anstatt Ausnahmen direkt zu drucken:

e.printStackTrace();

Sie sollten sie mit der API dieses Frameworks protokollieren:

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

Protokollierungs-Frameworks geben Ihnen viel Flexibilität, zB können Sie wählen, ob Sie sich in der Konsole oder in einer Datei anmelden möchten – oder vielleicht einige Nachrichten überspringen, wenn Sie sie in einer Umgebung nicht mehr relevant finden.

Benutzer-Avatar
Thomas

Wenn Sie anrufen printStackTrace() Bei einer Ausnahme wird in die Ablaufverfolgung geschrieben System.err und es ist schwierig, es an eine andere Stelle zu leiten (oder zu filtern). Stattdessen wird Ihnen empfohlen, ein Protokollierungs-Framework (oder einen Wrapper um mehrere Protokollierungs-Frameworks wie Apache Commons Logging) zu verwenden und die Ausnahme mit diesem Framework zu protokollieren (z logger.error("some exception message", e)).

Dadurch können Sie:

  • Schreiben Sie die Log-Anweisung gleichzeitig an verschiedene Orte, zB die Konsole und 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
  • usw.

Benutzer-Avatar
Stefan C

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:

  • Protokollmeldungen werden an einem konfigurierbaren Speicherort abgelegt.
  • Der Endbenutzer sieht die Nachrichten nicht, es sei denn, Sie konfigurieren die Protokollierung so, dass er/sie dies tut.
  • Sie können verschiedene Logger und Logging-Ebenen usw. verwenden, um zu steuern, wie viel wenig oder viel Logging aufgezeichnet wird.
  • Sie können verschiedene Appender-Formate verwenden, um zu steuern, wie die Protokollierung aussieht.
  • Sie können die Protokollausgabe einfach in ein größeres Überwachungs-/Protokollierungs-Framework einbinden.
  • Alle oben genannten Schritte können durchgeführt werden, ohne Ihren Code zu ändern. dh durch Bearbeiten der Protokollierungskonfigurationsdatei der bereitgestellten Anwendung.

Wenn Sie dagegen nur printStackTrace verwenden, hat der Deployer / Endbenutzer wenig oder gar keine Kontrolle, und Protokollierungsmeldungen gehen entweder verloren oder werden dem Endbenutzer unter unangemessenen Umständen angezeigt. (Und nichts erschreckt einen schüchternen Benutzer mehr als ein zufälliger Stack-Trace.)

In Simple ist e.printStackTrace() keine gute Praxis, da es nur den Stack-Trace als Standardfehler ausgibt. Aus diesem Grund können Sie nicht wirklich kontrollieren, wohin dieser Ausgang geht.

Benutzer-Avatar
abhi shukla

Fast jedes Protokollierungsframework stellt eine Methode bereit, in der wir das Throwable-Objekt zusammen mit einer Nachricht übergeben können. Wie:

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

Sie drucken den Stacktrace des Throwable-Objekts.

  • Dies beantwortet die Frage nicht.

    – Stefan C

    13. Oktober 2020 um 9:47 Uhr

Lassen Sie uns über das Unternehmenskonzept sprechen. Log gibt Ihnen flexible Ebenen (siehe Unterschied zwischen logger.info und logger.debug). Verschiedene Leute möchten verschiedene Ebenen sehen, wie QAs, Entwickler, Geschäftsleute. Aber e.printStackTrace() druckt alles aus. Auch wenn diese Methode restful aufgerufen wird, kann dieser Fehler mehrmals ausgegeben werden. Dann könnten die Devops- oder Tech-Ops-Leute in Ihrem Unternehmen verrückt werden, weil sie die gleichen Fehlererinnerungen erhalten. Ich denke, ein besserer Ersatz könnte sein log.error("errors happend in XXX", e)
Dadurch werden auch ganze Informationen ausgedruckt, die einfacher zu lesen sind als e.printStackTrace()

  • Dies beantwortet die Frage nicht.

    – Stefan C

    13. Oktober 2020 um 9:47 Uhr

Benutzer-Avatar
Amirhossein Hashemi

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

1281800cookie-checkVermeiden Sie printStackTrace(); Verwenden Sie stattdessen einen Logger-Aufruf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy