Logpoints zur Fehlerbehebung

Nachdem Sie Ihre Anwendung bereitgestellt oder gestartet haben, können Sie Stackdriver Debugger in der Google Cloud Platform Console öffnen. Mit Stackdriver Debugger können Sie Protokollierungsfunktionen in laufende Dienste einbinden, ohne die Dienste neu starten zu müssen oder deren normale Funktion zu beeinträchtigen. Dies kann bei der Fehlersuche hilfreich sein, wenn es Probleme bei der Produktion gibt. Es müssen keine Log-Anweisungen hinzugefügt und keine erneute Bereitstellung durchgeführt werden.

Besuchen Sie die Seite Fehlerbehebung in der Cloud Platform Console, um Google Stackdriver Debugger zu verwenden.

Vorbereitung

Stackdriver Debugger kann mit oder ohne Zugriff auf den Quellcode Ihrer Anwendungen verwendet werden. Sollte Ihr Quellcode nicht verfügbar sein, lesen Sie nachstehend den Abschnitt Einen Logpoint zur Fehlerbehebung hinzufügen, um zu erfahren, wie Sie den Dateinamen und die Zeilennummer manuell eingeben können.

Ist Ihr Quellcode hingegen in Google Cloud Repositories gespeichert, wird er in der Ansicht der Fehlerbehebung automatisch angezeigt.

Um auf Quellcode zuzugreifen, der an einem anderen Ort gespeichert ist, zum Beispiel lokal oder in einem Git-Repository, müssen Sie den Speicherort des Quellcodes auswählen.

Logpoints

Mit Logpoints können Sie Protokollierungsfunktionen in laufende Dienste einbinden, ohne die Dienste neu starten zu müssen oder deren normale Funktion zu beeinträchtigen. Jedes Mal, wenn eine beliebige Instanz den Code an der betreffenden Logpoint-Position ausführt, legt Stackdriver Debugger einen Protokolleintrag an. Die Ergebnisse werden an das für die Zielumgebung geeignete Protokoll gesendet. In App Engine wird die Ausgabe zum Beispiel an das Anfrage-Log in Stackdriver Logging übermittelt.

Logpoints bleiben ab ihrer Erstellung für 24 Stunden aktiv oder so lange, bis sie gelöscht werden oder der Dienst neu bereitgestellt wird.

Logpoint zur Fehlerbehebung hinzufügen

Konsole

So fügen Sie einen Logpoint über die Cloud Console hinzu:

  1. Wählen Sie den Tab Logpoint im rechten Bereich aus.
  2. Wählen Sie im linken Bereich die Datei aus, die den Quellcode enthält, dem Sie einen Logpunkt hinzufügen möchten. Der Inhalt der Datei wird im mittleren Bereich angezeigt.
  3. Klicken Sie zum Hinzufügen eines Logpoints auf die Zeilennummer an der betreffenden Position.
  4. Geben Sie die Nachricht in das Feld logpoint("") ein und klicken Sie auf "Hinzufügen". Sie können einen Ausdruck in geschweifte Klammern setzen, zum Beispiel {newScore.score}, um seinen Wert zu protokollieren.

Logpoint inline hinzufügen


Ist kein Quellcode verfügbar, können Sie im Feld Logpoint manuell den Dateinamen und die Zeilennummer im Format "Dateiname:Zeilennummer" sowie weitere Details eingeben: Logpoint manuell hinzufügen

gcloud

So fügen Sie einen Logpoint über die Befehlszeile hinzu:

gcloud debug logpoints create LOCATION MESSAGE

Dabei gilt:

  • LOCATION entspricht dem Dateinamen und der Zeile, in der der Logpoint eingerichtet wird. Das Format ist FILE:LINE, wobei FILE der Dateiname oder der Dateiname mit ausreichenden vorangestellten Pfadkomponenten sein kann, damit die Datei von anderen mit dem gleichen Namen unterschieden werden kann. Ist der Dateiname im Fehlerbehebungsziel nicht eindeutig, gilt dies als Fehler.
  • MESSAGE ist die Nachricht, die Sie protokollieren möchten.

Im folgenden Beispiel wird der Wert von score auf der Log-Ebene info (Standard-Log-Ebene für Logpoints) protokolliert:

gcloud debug logpoints create HighScoreService.java:105 \
  "User {name} scored {newScore.score}"

Bei Ausführung der Zeile 105 von HighScoreService.java executes wird die Nachricht protokolliert und die Werte der Variablen name und newScore.score werden in den Ausgabestring eingefügt.

Logpoint-Nachrichtenformat

Die Nachricht eines Logpoints legt fest, was in der Ausgabe protokolliert wird. Sie können über Ausdrücke Werte von Interesse untersuchen und protokollieren. Alles in der Nachricht zwischen geschweiften Klammern wie {myObj.myFunc()} oder {a + b} wird durch den Wert dieses Ausdrucks in der Ausgabe ersetzt. Die Nachricht User {name} scored {newScore.score} im obigen Beispiel protokolliert eine Ausgabe, die wie folgt aussehen kann: User user1 scored 99.

Sie können die folgenden Sprachfunktionen für Ausdrücke verwenden:

Java

Die meisten Java-Ausdrücke werden unterstützt, einschließlich:
  • lokale Variablen: a == 8.
  • numerische und boolesche Operationen: x + y < 20.
  • Instanz- und statische Felder: this.counter == 20, this.myObj.isShutdown, myStatic oder com.mycompany..MyClass.staticMember.
  • Stringvergleiche mit dem Gleichheitsoperator: myString == "abc".
  • Funktionsaufrufe. Es können ausschließlich Funktionen mit Lesezugriff genutzt werden. Zum Beispiel wird StringBuilder.indexOf() unterstützt, StringBuilder.append() hingegen nicht.
  • Typumwandlung mit vollständig qualifizierten Typen: ((com.myprod.ClassImpl) myInterface).internalField

Folgende Sprachfunktionen werden nicht unterstützt:

  • Entpacken numerischer Datentypen wie Integer; verwenden Sie stattdessen myInteger.value.

Python

Die meisten Python-Ausdrücke werden unterstützt, einschließlich:
  • Lesen lokaler und globaler Variablen
  • Lesen aus Arrays, Listen, Segmenten, Dictionaries und Objekten
  • Aufrufen einfacher Methoden

Folgende Sprachfunktionen werden nicht unterstützt:

  • Aufruffunktionen, die neue Objekte zuweisen oder komplexe Konstrukte verwenden
  • Erstellen neuer Objekte innerhalb eines Ausdrucks

Go

Der überwiegende Teil der Go-Syntax wird unterstützt, einschließlich:
  • Lesen lokaler und globaler Variablen
  • Lesen aus Arrays, Segmenten, Maps und Structs

Folgende Sprachfunktionen werden nicht unterstützt:

  • Lesen aus Schnittstellenwerten
  • Typumwandlungen und zusammengesetzte Literale
  • Alle Funktionsaufrufe außer len.

Logpoint-Bedingung

Eine Logpoint-Bedingung ist ein einfacher Ausdruck in der Anwendungssprache, dessen Ergebnis "wahr" sein muss, um den Logpoint zu protokollieren. Die Logpoint-Bedingungen werden jedes Mal ausgewertet, wenn die Zeile von einer beliebigen Instanz ausgeführt wird, bis der Logpoint abläuft oder gelöscht wird.

Die Bedingung ist ein vollständiger boolescher Ausdruck, der logische Operatoren enthalten kann:

travelAccessory == “Towel”
ultimateAnswer <= 42
travelAccessory == “Towel” && ultimateAnswer <= 42

Bei den Ausdrücken werden die gleichen Sprachfunktionen unterstützt wie bei den Bedingungen.

Konsole

Geben Sie die Bedingung innerhalb der Anweisung "if" ein:

Setzen Sie eine Bedingung inline

Wenn kein Quellcode verfügbar ist, können Sie die Bedingung im Logpoint-Steuerfeld angeben.

gcloud

Bedingungen werden mit dem Flag --condition von logpoints create erstellt:

gcloud debug logpoints create HighScoreService.java:105 
--condition="newScore.score > 40"
--log-level="warning"
"Suspiciously high score ({newScore.score}) from user {name}"

Im vorstehenden Beispiel prüft der Logpoint den Wert newScore.score, wenn Zeile 105 der Anwendung ausgeführt wird. Ist der Wert größer als 40, wird dem Protokoll eine Warnmeldung hinzugefügt.

Ausgabeanzeige

Die Ergebnisse werden an das für die Zielumgebung geeignete Protokoll gesendet.

App Engine

Logpoints, die in App Engine-Apps festgelegt wurden, senden ihre Ausgabe an das Anfrageprotokoll in Stackdriver Logging.

Sie können die Logs im Logbereich oder in der speziell dafür vorgesehenen Loganzeige aufrufen.

Logpoint im Logfeld

Compute Engine

Logpoints, die in Compute Engine-Apps festgelegt wurden, senden ihre Ausgabe an denselben Speicherort wie reguläre Log-Anweisungen. In Python sendet das Standard-Logging-Modul seine Ausgabe beispielsweise an stdout. Es kann jedoch so konfiguriert werden, dass es in eine bestimmte Datei schreibt.

Sie können den Logging-Agent so einrichten, dass diese Protokolle an Stackdriver Logging weitergeleitet werden. Von dort aus können Sie die Protokolle in der Loganzeige anzeigen.

Logpoints löschen

Logpoints werden nach 24 Stunden inaktiv und beenden die Protokollierung. Nach 30 Tagen werden sie automatisch gelöscht. Sie können Logpoints manuell löschen. Dadurch wird die Protokollierung gestoppt und der jeweilige Logpoint aus dem Verlauf gelöscht. Beachten Sie jedoch, dass die bereits generierten Protokollnachrichten durch das Löschen eines Logpoints nicht gelöscht werden.

Konsole

Um einen Logpoint manuell zu löschen, verwenden Sie das Dreipunkt-Menü im Bereich Logpoint-Verlauf.

Logpoint löschen

gcloud

Wenn Sie einen Logpoint manuell löschen möchten, geben Sie seine ID an oder verwenden reguläre Ausdrücke an der entsprechenden Position im Code:

gcloud debug logpoints delete HighScoreService.java:105

Debug target not specified. Using default target: default-1
This command will delete the following logpoints:

LOCATION                   CONDITION            LOG_LEVEL  LOG_MESSAGE_FORMAT                                             ID
HighScoreService.java:105                       INFO       User {name} scored {newScore.score}.                           53aaa3bd8d2d7-b76f-feb5d
HighScoreService.java:105  newScore.score > 40  WARNING    Suspiciously high score ({newScore.score}) from user {name}  53aaa3bsdffd7-b56f-fasfg

Do you want to continue (Y/n)?  Y
Deleted 2 logpoints.
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Stackdriver Debugger