Cloud Run Functions-Logs aufrufen und schreiben
Laufzeitlogs
Cloud Run Functions bietet standardmäßig einfaches Laufzeit-Logging. Logs, die in stdout oder stderr geschrieben wurden, erscheinen automatisch in der Google Cloud Console.
Verwenden Sie für ein erweitertes Logging die Cloud Logging-Clientbibliotheken.
Standardmäßig ist die Lognutzlast ein einfacher Textstring, wie in den folgenden Snippets dargestellt. Der String wird im Feld textPayload des Logeintrags gespeichert.
Node.js
Den meisten Logeinträgen ist keine Logebene zugeordnet. Dazu gehören:- Logs, die mit
console.log(),console.info(),console.warn()oderconsole.error()ausgegeben wurden - Logs, die direkt in
stdoutoderstderrgeschrieben wurden
Interne Systemmeldungen haben die Logebene DEBUG.
Python
- Logs, die in den Standardausgabe- oder Standardfehlerkanal geschrieben wurden, gehören zu keiner bestimmten Logebene.
- Interne Systemmeldungen haben die Logebene
DEBUG.
Go
- Logs, die in
stdoutoderstderrgeschrieben wurden, gehören zu keiner bestimmten Logebene. - Interne Systemmeldungen haben die Logebene
DEBUG.
Java
- Logs, die in
stdoutoderstderrgeschrieben wurden, gehören zu keiner bestimmten Logebene. - Interne Systemmeldungen haben die Logebene
DEBUG.
C#
using Google.Cloud.Functions.Framework; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; namespace LogHelloWorld; public class Function : IHttpFunction { private readonly ILogger _logger; public Function(ILogger<Function> logger) => _logger = logger; public async Task HandleAsync(HttpContext context) { Console.WriteLine("I am a log to stdout!"); Console.Error.WriteLine("I am a log to stderr!"); _logger.LogInformation("I am an info log!"); _logger.LogWarning("I am a warning log!"); await context.Response.WriteAsync("Messages successfully logged!", context.RequestAborted); } }
- Text, der in
stdoutundstderrgeschrieben wurde (z. B. überConsole.WriteLinebzw.Console.Error.WriteLine), hat keine Logebene. - ASP.NET Core-Logging-Ebenen werden Cloud Logging-Ebenen so zugeordnet:
LogLevel.TraceundLogLevel.Debug mapzu Cloud Logging-DEBUG.LogLevel.Informationist Cloud Logging-INFOzugeordnet.LogLevel.Warningist Cloud Logging-WARNINGzugeordnet.LogLevel.Errorist Cloud Logging-ERRORzugeordnet.LogLevel.Criticalist Cloud Logging-CRITICALzugeordnet.
Ruby
Logeinträgen ist keine Logebene zugeordnet.
PHP
use Psr\Http\Message\ServerRequestInterface; function helloLogging(ServerRequestInterface $request): string { // Code running in Google Cloud Functions itself writes log entries to // Cloud Logging. (Default log severity level is INFO.) $log = fopen('php://stderr', 'wb'); fwrite($log, "Log entry from fwrite().\n"); // You can also specify a severity level explicitly using structured logs. // See this page for a list of log severity values: // https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity fwrite($log, json_encode([ 'message' => 'Structured log with error severity', 'severity' => 'error' ]) . PHP_EOL); // This will log to standard error, which will appear in Cloud Logging error_log('error_log logs in Cloud Functions!'); // This will log an error message and immediately terminate the function execution // trigger_error('fatal errors are logged!'); // For HTTP functions, this is added to the HTTP response // For CloudEvent functions, this does nothing var_dump('var_dump goes to HTTP response for HTTP functions'); // You can also dump variables using var_export() and forward // the resulting string to Cloud Logging via an fwrite() call. $entry = var_export('var_export output can be captured.', true); fwrite($log, $entry); // Functions must return a String or PSR-7 Response object return ''; }
Strukturierte Logs schreiben
Die oben beschriebenen standardmäßigen Textlogs gehören zu keiner bestimmten Logebene.
Wenn Sie Logeinträge oder andere bestimmte Felder in Ihre Logeinträge aufnehmen möchten, können Sie Logs in Form einer einzelnen Zeile mit serialisiertem JSON in stdout oder stderr schreiben. Diese Zeile wird von Cloud Run Functions erfasst und geparst und in das Feld jsonPayload statt in textPayload eingefügt. Die folgenden Snippets veranschaulichen, wie derartige strukturierte Logs geschrieben werden.
Node.js
Python
Strukturierte Logging-Unterstützung ist ab Python 3.8 verfügbar.
Go
Die Struktur für jeden Logeintrag wird vom Typ Entry bereitgestellt:
Wenn eine Eintragsstruktur protokolliert wird, wird die Methode String aufgerufen, um sie in das von Cloud Logging erwartete JSON-Format zu überführen:
Java
Aktivieren Sie das JSON-Logging mit Logback und SLF4J. Dazu aktivieren Sie den Logstash-JSON-Encoder in Ihrer logback.xml-Konfiguration.
Spezielle JSON-Felder in Nachrichten verarbeiten
Wenn Sie ein strukturiertes Log als JSON-Wörterbuch erstellen, werden bestimmte Felder aus jsonPayload entfernt und in das entsprechende Feld im erstellten LogEntry geschrieben, wie in der Dokumentation für bestimmte Felder beschrieben.
Wenn Ihre JSON-Datei beispielsweise das Attribut severity enthält, wird es aus jsonPayload entfernt und stattdessen als severity des Logeintrags angezeigt. Das Attribut message wird als Hauptanzeigentext des Logeintrags verwendet, sofern vorhanden.
Logs mit Clientbibliotheken schreiben
Cloud Logging-Clientbibliotheken bieten eine alternative Möglichkeit, Logs zu schreiben. Mit diesen Bibliotheken können Sie die Logging-Standardmechanismen Ihrer Programmiersprache verwenden und in verschiedene unterstützte Logging-Frameworks einbinden. Clientbibliotheken vereinfachen auch die Ausfüllung der speziellen JSON-Felder, indem einige Informationen automatisch erfasst und Schnittstellen bereitgestellt werden, um die Felder entsprechend auszufüllen.
Sie können Clientbibliotheken verwenden, um Logs mit der Cloud Logging API synchron oder asynchron zu schreiben. Einige Clientbibliotheken unterstützen auch das Schreiben strukturierter Logs direkt in stdout oder stderr. Wenn Sie Logs asynchron schreiben, kann eine unerwartete Funktionsbeendigung zu Logverlusten führen.
Beachten Sie auch, dass das synchrone Logging mit der Logging API die Ausführungszeit der Funktion erhöht, da sie auf den Abschluss von API-Aufrufen wartet.
Laufzeitlogs ansehen
In diesem Abschnitt werden die Optionen zum Aufrufen von Laufzeitlogs beschrieben.
Befehlszeilentool verwenden
Logs für Cloud Run Functions können über die Cloud Logging-UI und die Google Cloud CLI aufgerufen werden.
Wenn Sie Logs mit der gcloud CLI aufrufen möchten, verwenden Sie den Befehl gcloud functions logs read:
gcloud functions logs read
Zum Anzeigen der Logs für eine bestimmte Funktion geben Sie den Funktionsnamen als Argument an:
gcloud functions logs read FUNCTION_NAME
So rufen Sie die Logs für eine bestimmte Ausführung auf:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
Informationen zu allen Loganzeigeoptionen finden Sie in der Dokumentation zu gcloud functions logs read.
Logging-Dashboard verwenden
Sie können Laufzeitlogs für Cloud Run Functions auch in der Google Cloud Console aufrufen.
Logging API verwenden
Laufzeitlogs können auch über die Cloud Logging API geschrieben und abgerufen werden. Die Cloud Logging-Clientbibliotheken bieten eine idiomatische Schnittstelle zur Logging API:
Node.js
Weitere Informationen finden Sie in der Referenz zur Node.js-Clientbibliothek.Python
Weitere Informationen finden Sie in der Referenz zur Python-Clientbibliothek.Go
Weitere Informationen finden Sie in der Referenz zur Go-Clientbibliothek.Java
Weitere Informationen finden Sie in der Referenz zur Java-Clientbibliothek.C#
private void ListLogEntries(string logId) { var client = LoggingServiceV2Client.Create(); LogName logName = new LogName(s_projectId, logId); ProjectName projectName = new ProjectName(s_projectId); var results = client.ListLogEntries(Enumerable.Repeat(projectName, 1), $"logName={logName.ToString()}", "timestamp desc", callSettings: _retryAWhile); foreach (var row in results) { Console.WriteLine($"{row.TextPayload.Trim()}"); } }
Ruby
PHP
use Google\Cloud\Logging\LoggingClient; /** * Print the timestamp and entry for the project and logger. * * @param string $projectId The Google project ID. * @param string $loggerName The name of the logger. */ function list_entries($projectId, $loggerName) { $logging = new LoggingClient(['projectId' => $projectId]); $loggerFullName = sprintf('projects/%s/logs/%s', $projectId, $loggerName); $oneDayAgo = date(\DateTime::RFC3339, strtotime('-24 hours')); $filter = sprintf( 'logName = "%s" AND timestamp >= "%s"', $loggerFullName, $oneDayAgo ); $options = [ 'filter' => $filter, ]; $entries = $logging->entries($options); // Print the entries foreach ($entries as $entry) { /* @var $entry \Google\Cloud\Logging\Entry */ $entryInfo = $entry->info(); if (isset($entryInfo['textPayload'])) { $entryText = $entryInfo['textPayload']; } else { $entryPayload = []; foreach ($entryInfo['jsonPayload'] as $key => $value) { $entryPayload[] = "$key: $value"; } $entryText = '{' . implode(', ', $entryPayload) . '}'; } printf('%s : %s' . PHP_EOL, $entryInfo['timestamp'], $entryText); } }
Weitere Logging-Optionen für Java finden Sie unter Java Logging.
Auf Laufzeitlogs reagieren
Sie können auf Cloud Logging-Ereignisse reagieren, indem Sie ihre Logs an eine Cloud Run Function weiterleiten. Weitere Informationen finden Sie auf der Seite Trigger einer zweiten Partei mit Cloud Logging.
Build-Image-Logs aufrufen
Sie können auch die Logs für das Erstellen von Cloud Functions-Images während des Bereitstellungsprozesses aufrufen. Weitere Informationen erhalten Sie über den Link.