Debugging-Logpoints

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

Informationen zur Verwendung von Google Cloud Debugge finden Sie auf der Seite Debugging in der Cloud Console.

Hinweis

Cloud Debugger kann mit und ohne Zugriff auf den Quellcode Ihrer Anwendung verwendet werden. Sollte Ihr Quellcode nicht verfügbar sein, lesen Sie nachstehend den Abschnitt Debugging-Logpoint 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 Debugging-Ansicht 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 Protokollierungen 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 Cloud Debugger einen Logeintrag an. Die Ergebnisse werden an das für die Zielumgebung geeignete Protokoll gesendet. In App Engine wird die Ausgabe beispielsweise an das Anfragelog in Cloud Logging gesendet.

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

Debugger-Agent mit Canary-Test

Nachdem Sie einen Logpoint festgelegt haben, testet der Debugger-Agent den Logpoint an einer Teilmenge Ihrer Instanzen. Nachdem der Debugger-Agent überprüft hat, ob der Logpoint erfolgreich ausgeführt werden kann, wird der Logpoint auf alle Instanzen angewendet. Dies dauert ungefähr 40 Sekunden.

Nach diesem Vorgang protokolliert der Debugger-Agent die Nachricht, wenn der Logpoint ausgelöst wird. Wenn der Logpoint innerhalb von 400Sekunden nach dem Festlegen ausgelöst wird, protokolliert der Debugger-Agent die Nachricht von den Instanzen, auf die der Canary-Logpoint angewendet wurde.

Der Debugger-Agent setzt verschiedene Strategien ein, um die durch die Datenerfassung verursachte Latenz so gering wie möglich zu halten.

Sie sehen Folgendes, während der Debugger-Agent den Canary-Test ausführt:

Der Debugger-Agent führt Canary-Instanzen aus

Informationen zur Reaktion darauf, wenn der Debugger-Agent im Canary-Modus ausfällt, finden Sie im Abschnitt "Fehlerbehebung" auf der Seite "Snapshots zur Fehlerbehebung".

Auf den sprachspezifischen Seiten finden Sie Informationen dazu, welche Debugger-Agent-Versionen Canary-Funktionen haben.

Debugger-Agent ohne Canary-Test

Wenn Sie den Debugger-Agent ohne Canary-Test verwenden und einen Logpoint festlegen, gilt dieser für alle ausgeführten Instanzen Ihrer Anwendung. Wenn eine Instanz den Code zum ersten Mal am Logpoint-Speicherort ausführt, protokolliert der Debugger-Agent die Nachricht. Der Debugger-Agent setzt verschiedene Strategien ein, um die durch die Datenerfassung verursachte Latenz so gering wie möglich zu halten.

Debugging-Logpoint 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 einfü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 einfügen

gcloud

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

gcloud debug logpoints create LOCATION MESSAGE

Wobei:

  • 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 Debugging-Ziel nicht einmalig, gilt dies als Fehler.
  • MESSAGE ist die Nachricht, die Sie protokollieren möchten.

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

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 so 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, darunter:
  • Lokale Variablen: a == 8.
  • Numerische und boolesche Operatoren: x + y < 20.
  • Instanzfelder 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 schreibgeschützte Funktionen genutzt werden. Beispiel: StringBuilder.indexOf() wird unterstützt, StringBuilder.append() jedoch 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 Sprachfeatures 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, darunter:
  • 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.

Console

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 Log eine Warnmeldung hinzugefügt.

Ausgabeanzeige

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

App Engine

Logpoints, die in App Engine-Anwendungen festgelegt wurden, senden ihre Ausgabe an das Anfragelog in 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 Loganweisungen. 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 Logs an Cloud Logging weitergeleitet werden. Von dort aus können Sie die Logs in der Loganzeige ansehen.

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.