Generieren und Analysieren von Protokollen
Lernziele
- Anzeigen von Debug-Protokollen im Log Inspector oder einem Texteditor
- Festlegen verschiedener Protokollierungsebenen für Ihre Debug-Protokolle
- Verwalten und Wechseln von Perspektiven mit dem Log Inspector
Anzeigen von Debug-Protokollen
Als guter Raumschiffkapitän kontrollieren Sie die Systemprotokolle, um sicherzustellen, dass alles ordnungsgemäß funktioniert. Protokolle sind mit am besten dazu geeignet, Probleme bei einem System oder Programm festzustellen. Mit der Developer Console können Sie sich verschiedene Debug-Protokolle ansehen, um die Funktionsweise Ihres Codes zu verstehen und Leistungsprobleme zu identifizieren.
Anzeigen von Protokollen im Texteditor
Das Anzeigen eines Debug-Protokolls ist einfach. Zum Erstellen eines Protokolls führen wir die Apex-Klasse EmailMissionSpecialist
aus, die Sie zu einem früheren Zeitpunkt erstellt haben.
- Vor der Ausführung aktivieren Sie dazu Open Log (Protokoll öffnen) im Fenster "Enter Apex Code (Apex-Code eingeben)". Das Protokoll wird nach der Ausführung Ihres Codes geöffnet.
- Nach der Ausführung doppelklicken Sie dazu auf das Protokoll, das auf der Registerkarte "Logs (Protokolle)" aufgeführt wird.
- Wählen Sie Debug (Debuggen) | Open Execute Anonymous Window (Fenster für die anonyme Ausführung öffnen) aus.
- Im Fenster "Enter Apex Code (Apex-Code eingeben)" wird der letzte Code angezeigt, den Sie zur Ausführung eingegeben haben. Löschen Sie diesen Code und fügen Sie den folgenden Code in das Fenster ein. Ersetzen Sie unbedingt Enter your email address (Geben Sie Ihre E-Mail-Adresse) durch Ihre E-Mail-Adresse.
EmailMissionSpecialist em = new EmailMissionSpecialist(); em.sendMail('Enter your email address', 'Flight Path Change', 'Mission Control 123: Your flight path has been changed to avoid collision ' + 'with asteroid 2014 QO441.');
- Aktivieren Sie die Option Open Log (Protokoll öffnen).
- Klicken Sie auf Execute (Ausführen).
Da das angezeigte Ausführungsprotokoll in Ihren Augen wahrscheinlich nur aus einer verwirrenden Mischung aus Zahlen und Wörtern besteht, sehen wir uns nun an, wie Sie Protokolldaten lesen und verstehen.
Lesen Ihrer Protokolldaten
Wir führen jetzt erneut die Klasse EmailMissionSpecialist
aus, versehen sie dieses Mal aber mit einem Fehler. Anschließend suchen wir das daraus resultierende Protokoll in der Registerkarte "Logs (Protokolle)".
- Wählen Sie Debug (Debuggen) | Open Execute Anonymous Window (Fenster für die anonyme Ausführung öffnen) aus. Geben Sie eine ungültige E-Mail-Adresse wie etwa
testingemail
an.EmailMissionSpecialist em = new EmailMissionSpecialist(); em.sendMail('testingemail', 'Flight Path Change', 'Mission Control 123: Your flight path has been changed to avoid collision ' + 'with asteroid 2014 QO441.');
- Deaktivieren Sie die Option Open Log (Protokoll öffnen).
- Klicken Sie auf Execute (Ausführen). Nach der Ausführung des Codes wird ein Dialogfeld mit dem Fehler angezeigt.
- Klicken Sie auf OK und doppelklicken Sie dann auf das neue Protokoll in der Registerkarte "Logs (Protokolle)". Wenn Sie nicht sicher sind, welches Protokoll das neueste ist, klicken Sie auf die Überschrift der Spalte "Timestamp (Zeitstempel)", um die Protokolle nach ihrem Erstellungszeitpunkt zu sortieren.
- Timestamp: Die Uhrzeit, zu der das Ereignis auftrat. Der Zeitstempel wird immer in der Zeitzone des Benutzers und im Format HH:mm:ss.SSS angegeben.
-
Event: Das Ereignis, das den Eintrag im Debug-Protokoll auslöste. In dem von Ihnen erstellten Ausführungsprotokoll wird beispielsweise das Ereignis
FATAL_ERROR
protokolliert, als festgestellt wurde, dass die E-Mail-Adresse ungültig ist. - Details: Details über die Codezeile und den Methodennamen der Codeausführung.
Sie können die Anzeige im Ausführungsprotokoll ändern, indem Sie This Frame (Dieser Frame) (a), Executable (Ausführbare Datei) (b) oder Debug Only (Nur debuggen) (c) auswählen. Bei Auswahl dieser Optionen werden nur bestimmte Arten von Ereignissen angezeigt. So zeigt "Debug Only (Nur debuggen)" beispielsweise USER_DEBUG-Ereignisse. Mit Filter (d) können Sie auch andere Teile des Protokolls filtern. Geben Sie einen Methodenname oder anderen Text ein, den Sie speziell suchen, um die im Protokoll angezeigten Ergebnisse entsprechend zu filtern.
Sie können das Debug-Protokoll auch als Rohprotokoll anzeigen, um mehr Informationen zu erhalten. Wählen Sie dazu File (Datei) | Open Raw Log (Rohprotokoll öffnen) aus. Der Zeitstempel im Rohprotokoll gibt die Zeitdauer in Nanosekunden (Wert in Klammern) an, die seit dem Beginn des Ereignisses vergangen ist.
Diese Kombination aus Zeitstempel, Ereignis und Details bietet wertvolle Erkenntnisse über die Funktionsweise Ihres Codes und die aufgetretenen Fehler.
Alle diese Informationen sind ja schön und gut, doch was ist, wenn Sie in einem Debug-Protokoll schnell nach bestimmten Werten suchen möchten? Sie haben als Raumschiffkapitän schließlich noch viele andere Aufgaben. Wenn Sie schnell bestimmte Werte sehen möchten, verwenden Sie dazu am besten die Methode System.debug()
in Apex.
Das Plus an System.debug()
ist, dass Sie diese Methode an jeder beliebigen Stelle zu ihrem Code hinzufügen können, um Werte nachzuverfolgen, die Ihnen das Debuggen Ihres eigenen Codes erleichtern.
System.debug()
lautet wie folgt. Zum Anzeigen einer Meldung:System.debug('Your Message');
System.debug(yourVariable);
System.debug('Your Label: ' + yourVariable);
Verwenden des Protokollinspektors
Der praktische Log Inspector erleichtert Ihnen das Anzeigen umfangreicher Protokolle. Im Log Inspector werden Protokollbereichsansichten verwendet, um unterschiedliche Perspektiven Ihres Codes darzustellen. Sie können sich selbst davon überzeugen, indem Sie Debug (Debuggen) | | View Log Panels (Protokollbereiche anzeigen) auswählen.
Protokollbereiche ändern die Struktur des Protokolls, um weitere nützliche Informationen über den Kontext des Codes zu liefern, der ausgeführt wird. Verschiedene Bereiche zeigen beispielsweise Ursprung, Ausführungszeiten, Heap-Größe und Aufrufhierarchie. (Ja, leider noch mehr Fachchinesisch – dieser Abschnitt ist eben ziemlich technisch. Nicht vergessen: Wir lernen hier die Developer Console kennen, nicht die Feinheiten von Debugging-Methoden. Falls Ihnen manche Dinge also unklar sind, lassen Sie sich davon nicht zu sehr verunsichern.)
Diese Protokollbereiche interagieren miteinander, um Sie beim Debuggen Ihres Codes zu unterstützen. Wenn Sie zum Beispiel im Bereich "Execution Log (Ausführungsprotokoll)" oder "Stack Tree (Stapelbaum)" auf einen Protokolleintrag klicken, werden die anderen Bereiche ("Source (Quelle)", "Source List (Quellliste)", "Variables (Variablen)" und "Execution Stack (Ausführungsstapel") mit zugehörigen Informationen aktualisiert.
- Stack Tree (Stapelbaum): Zeigt Protokolleinträge innerhalb der Hierarchie ihres Objekts und ihrer Ausführung in einer absteigenden Baumansicht an. Wenn eine Klasse beispielsweise eine zweite Klasse aufruft, wird die zweite Klasse als untergeordnete Klasse der ersten angezeigt.
- Execution Stack (Ausführungsstapel): Zeigt eine "aufsteigende" Ansicht des ausgewählten Elements an. Hier wird zuerst der Protokolleintrag, gefolgt von der Operation, die ihn aufgerufen hat, angegeben.
- Execution Log (Ausführungsprotokoll): Führt jede Aktion auf, die während der Ausführung Ihres Codes auftrat.
- Source (Quelle): Zeigt den Inhalt der Quelldatei an. Die Codezeile, die ausgeführt wurde, als der ausgewählte Protokolleintrag generiert wurde, ist markiert.
- Source List (Quellliste): Zeigt den Kontext des Codes an, der ausgeführt wurde, als das Ereignis protokolliert wurde. Wenn Sie beispielsweise den Protokolleintrag auswählen, der erstellt wurde, als der fehlerhafte E-Mail-Adressenwert eingegeben wurde, dann enthält der Bereich "Source List (Quellliste)" die Angabe execute_anonymous_apex.
- Variables (Variablen): Zeigt die Variablen und ihre zugewiesenen Werte an, die sich im jeweiligen Bereich befanden, als der Code ausgeführt wurde, der zur Erstellung des ausgewählten Protokolleintrags führte.
- Execution Overview (Ausführungsübersicht): Zeigt Statistiken für den ausgeführten Code an, einschließlich Ausführungszeit und Heap-Größe.
Was ist der Perspective Manager und wie können Sie Perspektiven wechseln?
Eine Perspektive ist ein Layout mit gruppierten Bereichen. Die vordefinierte Perspektive "Debug (Debuggen)" zeigt beispielsweise "Execution Log (Ausführungsprotokoll)", "Source (Quelle)" und "Variables (Variablen)" an, während die Perspektive "Analysis (Analyse)" die Bereiche "Stack Tree (Stapelbaum)", "Execution Log (Ausführungsprotokoll)", "Execution Stack (Ausführungsstapel)" und "Execution Overview (Ausführungsübersicht)" zeigt.
Zur Auswahl einer Perspektive wählen Sie Debug (Debuggen) | Switch Perspectives (Perspektiven umstellen) oder Debug (Debuggen) | Perspective Manager (Perspektiven-Manager) aus. Das ist genauso leicht wie der Wechsel zwischen unterschiedlichen Kommunikationsbereichen und viel leichter als zu versuchen, aus den Protokollen von Ihrem Missionsspezialisten, der Bodenstation auf der Erde und dem Kontrollzentrum auf dem Mars in ein und derselben Ansicht schlau zu werden.
Sie können auch Ihre eigene Perspektive definieren. Konfigurieren Sie Ihre bevorzugte Kombination aus anzuzeigenden Bereichen und wählen Sie dann Debug (Debuggen) | Save Perspective As (Perspektive speichern unter) aus. Geben Sie einen Namen für Ihre Perspektive ein und klicken Sie auf OK.
Bearbeiten von Protokolldaten, um notwendige Erkenntnisse zu gewinnen
Sie haben festgestellt, dass das Triebwerk 3 manchmal nicht einwandfrei läuft. Es ist unbedingt notwendig, dass das Triebwerk störungsfrei und mit voller Leistung läuft, wenn Sie versuchen, dem Asteroiden 2014 QO441 ausweichen. Doch bei jeder Ausführung eines Systemchecks erhalten Sie auch Informationen von einem unzufriedenen Roboter in Ihrem Raumschiff. Er sendet unverständliche Berichte, die einen Aufstand der Roboter vorhersagen, und bläht so Ihr Protokoll unnötig auf, wodurch Sie eventuell sogar wertvolle Informationen übersehen.
Sie müssen eine Möglichkeit finden, die Menge protokollierter Informationen zu steuern. Glücklicherweise tut die Developer Console genau dies mithilfe von Protokollkategorien und Protokollierungsebenen.
Protokollkategorien
Eine Protokollkategorie bezeichnet die Art der protokollierten Informationen.
- ApexCode protokolliert Ereignisse im Zusammenhang mit Apex-Code und enthält Informationen über Start und Ende einer Apex-Methode.
- Database (Datenbank) enthält Protokolle in Bezug auf Datenbankereignisse einschließlich DML- (Database Manipulation Language), SOSL- und SOQL-Abfragen (dazu kommen wir später).
Protokollierungsebenen und ihre Festlegung
Anscheinend hat Triebwerk 3 wieder Probleme. Als Sie die Protokolle durchsehen, um die mögliche Ursache dieser Probleme festzustellen, stoßen Sie auf Warnungen des traurigen Roboters wegen des Aufstands.
Nun, ein Roboter macht noch keinen Aufstand, und Sie sind wegen der Warnungen nicht allzu besorgt. Das fehlerhafte Triebwerk ist jedoch ein dringendes Problem. Was, wenn die konkreten Meldungen von Triebwerk 3 in all diesen Protokolldaten untergehen? Hier gibt es nur eine Rettung: Protokollierungsebenen!
NONE
) zur höchsten protokollierten Datenmenge (Ebene = FINEST
) reichen.NONE
ERROR
WARN
INFO
DEBUG
FINE
FINER
FINEST
Protokollierungsebenen sind kumulativ. Wenn Sie also beispielsweise die Protokollierungsebene INFO
für ein Ereignis auswählen, beinhaltet das Protokoll auch Informationen der Ebenen ERROR
und WARN
. Legen Sie jedoch die Protokollierungsebene ERROR
fest, werden nur Fehlermeldungen protokolliert. Warnmeldungen und andere Protokollinformationen für diese Protokollkategorie erhalten Sie nicht.
Die Informationen einer Protokollierungsebene hängen auch vom Protokollereignis ab. Bei unterschiedlichen Protokollereignissen beginnt die Protokollierung auf bestimmten Protokollierungsebenen. Bei manchen ApexCode-Ereignissen beginnt die Protokollierung beispielsweise auf der Ebene INFO
. Legen Sie in diesem Fall die Protokollierungsebene ERROR
fest, erhalten Sie keine Protokollinformationen zu diesen Ereignissen.
Um die erforderlichen Informationen zu erhalten, ändern Sie die Protokollierungsebenen für verschiedene Ereignisse. Sie möchten die Protokollierung unterdrücken, wenn der Roboter Meldungen über den zu erwartenden Aufstand in der Datenbank speichert. Dazu legen Sie die Protokollierungsebene für die Database-Kategorie (DB
) auf NONE
oder ERROR
fest.
Zur Festlegung der Protokollierungsebenen wählen Sie Debug (Debuggen) | Change Log Levels (Protokollierungsebenen ändern) aus.
Klicken Sie auf der Registerkarte "General Trace Settings for You (Allgemeine Einstellungen für die Ablaufverfolgung für Sie)" auf Add/Change (Hinzufügen/Ändern)(1). Wählen Sie im Fenster "Change DebugLevel (Protokollierungsebene ändern)" die Protokollierungsebene für die einzelnen Kategorien. Nicht vergessen: Setzen Sie Protokollierungsebenen vernünftig ein. Wenn Sie die Protokollierungsebene auf FINEST
(2) einstellen, überschreitet Ihr Code eventuell Protokolllimits und kann dann nicht mehr ausgeführt werden. Lassen Sie sich nicht irritieren, falls beim Ändern der Protokollierungsebene für eine Kategorie nicht alle Ebenen angezeigt werden. Es werden nur die Ebenen aufgeführt, die die Protokollierung für die Kategorie ausweiten.
Nachdem Sie die Protokollierung für die Warnungen des Roboters deaktiviert haben, lässt sich glücklicherweise das Problem bei Triebwerk 3 problemlos feststellen: Der Kühlmittelstand ist niedrig. Sie weisen sofort einen Techniker an, Kühlmittel nachzufüllen. Und da Sie schon dabei sind, tragen Sie dem Techniker zudem auf, die Gelenke des Roboters zu ölen. Sie hoffen, dass der Roboter frisch geschmiert ein bisschen zufriedener ist.