Gibt es einen Grund, Stack-Traces nicht immer zu protokollieren?

8

In unserer heutigen Anwendung ist ein frustrierendes Problem aufgetreten, das auf eine Ausnahme vom Typ ArrayIndexOutOfBounds zurückzuführen ist. Der Typ der Ausnahme war so ziemlich alles, was protokolliert wurde, was ziemlich nutzlos ist (aber, oh liebe alte App, wir lieben dich immer noch, meistens). Ich habe die Anwendung mit einer Änderung neu implementiert, die den Stack-Trace bei der Ausnahmebehandlung protokolliert (und sofort die Ursache des Problems gefunden hat) und mich gewundert, warum niemand zuvor dies getan hat. Protokollieren Sie den Stack-Trace in der Regel und gibt es einen Grund, warum Sie dies nicht tun würden?

Bonuspunkte, wenn Sie erklären können (warum, nicht wie), warum Sie in java springen müssen, um eine String-Darstellung eines Stack-Trace zu erhalten!

    
Chris Knight 25.03.2010, 22:19
quelle

7 Antworten

9
  • Einige Protokolle enthalten möglicherweise vertrauliche Daten, Protokolleinrichtungen sind nicht unbedingt sicher genug, um diese Daten in der Produktion zu verfolgen.

  • Wenn zu viel protokolliert wird, kann dies zu zu vielen Informationen führen, d. h. es liegen für die Systemadministratoren überhaupt keine Informationen vor. Wenn ihre Protokolle mit Debug-Meldungen gefüllt sind, können sie keine verdächtigen Muster erkennen. (Vor Jahren sah ich ein System, das alle Systemaufrufe aus Sicherheitsgründen protokollierte. Es gab so viele Protokolle, dass niemand es gesehen hat, als einige nicht privilegierte Benutzer anfingen, root zu werden.)

Am besten protokollieren Sie alles mit entsprechenden Loglevels und können Loglevel in der Produktion einstellen (zumindest in Java ist das kein großes Problem).

    
sibidiba 25.03.2010, 23:05
quelle
3

Bitte beachten Sie auch diese Fragen

Anmelden in Java und allgemein: Best Practices?

Best Practices für die Java-Protokollierung von mehreren Threads?

Wichtige Dinge hier zu beachten

  1. Umgang mit sensiblen Daten
  2. Kompakte Ausnahmemeldungen und diese an die entsprechenden Fixer senden
  3. Protokollieren, was erforderlich ist. Weil sein Logging in Bezug auf den Platz teuer ist und Zeit
pramodc84 26.03.2010 06:57
quelle
2

Im Allgemeinen protokolliere ich den Stack-Trace, da er Informationen zur Fehlerbehebung / Fehlersuche enthält. Es ist das beste Denken neben einem Minidump und führt oft zu einer Lösung einfach durch Code-Inspektion und Identifizierung des Problems.

Übrigens stimme ich Sibidiba mit der möglichen Offenlegung von Informationen über Ihre App-Interna zu, die ein voller Stack offen legt: Die Funktionsnamen können zusammen mit der Stapelaufruffolge einem gebildeten Leser viel erzählen. Dies ist der Grund, warum einige Produkte nur die Symboladresse auf dem Stack protokollieren und sich auf die Devs verlassen, um die Adresse von internen pdbs in den Namen aufzulösen.

Aber ich denke, dass das Loggen von Text in Dateien, die eine Zeile Fehler und 14 Zeilen Stack enthalten, es sehr schwierig macht, in den Fehlerprotokollen zu navigieren. Es verursacht auch Probleme bei Anwendungen mit hoher Zuverlässigkeit, da die Sperre für die Protokolldatei länger gehalten wird (oder schlimmer, die Protokolldateien werden verschachtelt). Das häufige Auftreten dieser Probleme zusammen mit anderen Problemen bei der Unterstützung und Problembehandlung von Bereitstellungen meiner eigenen Apps führte dazu, dass ich einen Dienst für Protokollierungsfehler bei bugcollect erstellte. com . Beim Entwerfen der Fehlererfassungsrichtlinien habe ich gewählt, die Stack-Dumps jedes Mal zu sammeln und die Stacks als Teil der Bucket-Keys zu verwenden (um Fehler, die auf demselben Stack passieren, in denselben Bucket zu gruppieren).

    
Remus Rusanu 26.03.2010 02:18
quelle
1

Einschränkungen bei der Protokollierung werden oft durchgesetzt, wenn sich Entwickler zu großzügig anmelden und Sysadmins feststellen, dass die App, sobald sie unter eine Produktionslast gestellt wird, die riesigen Protokolldateien durcheinanderbringt und füllt. Es kann dann schwierig sein, sie davon zu überzeugen, dass Sie den Fehler Ihrer Möglichkeiten gesehen haben und die Protokollierung (oder die angepassten Protokollebenen) ausreichend reduziert haben, aber wirklich diese verbleibenden Protokolleinträge benötigen.

    
Michael Borgwardt 25.03.2010 22:43
quelle
1

Für uns ist es sehr einfach: Wenn eine unerwartete Ausnahme ausgelöst wird, protokollieren wir den Stack-Trace und geben so eine Nachricht wie möglich an.

Meine Vermutung ist, dass der Entwickler, der den ursprünglichen Code in der Frage geschrieben hat, einfach nicht erfahren genug war, um zu wissen, dass es nicht nur mit der Nachricht reicht. Das habe ich auch einmal gedacht.

Der Grund, warum es so kompliziert ist, einen Stack-Trace als String zu bekommen, liegt daran, dass es in der JRE keinen StringPrintWriter gibt. Ich glaube, dass sie viele orthogonale Bausteine ​​zur Verfügung gestellt haben, die Sie dann kombinieren . Sie müssen den benötigten PrintWriter selbst zusammenstellen.

    
quelle
0
  

Bonuspunkte, wenn Sie erklären können (warum   nicht wie) das Grundprinzip hinter dem Haben   in java springen, um eine Schnur zu bekommen   Darstellung einer Stack-Trace!

Solltest du nicht einfach den Through-Befehl protokollieren, anstatt durch die Hoops zu gehen, um den Stacktrace zu drucken? Wie folgt: log.error ("Fehler beim Deployment!", Ex). Wenn ein Throwable gegeben wird, wird Log4J sowohl die über getMessage () als auch den Stack-Trace erhaltene Fehlermeldung ausgeben.

    
CoolBeans 26.03.2010 18:26
quelle
0

Was ich schon oft gesehen habe, ist die Code-Protokollierung einer Ausnahme wie dieser:

  

LOG.fehler (ex);

Da log4j ein Objekt als erstes Argument akzeptiert, protokolliert es die String-Repräsentation der Exception, die oft nur der Name der Klasse ist. Dies ist normalerweise nur ein Versehen des Entwicklers. Es ist besser loggen und Fehler wie folgt:

  

LOG.fehler ("foo passiert", ex);

.. Wenn das Protokollierungs-Framework ordnungsgemäß konfiguriert ist, protokolliert es den Stack-Trace.

    
Ken Liu 26.03.2010 18:39
quelle

Tags und Links