Visualizza e scrivi log delle funzioni Cloud Run
Scrittura dei log di runtime
Per impostazione predefinita, Cloud Run Functions include un semplice logging di runtime. I log scritti in stdout o stderr verranno visualizzati automaticamente nellaconsoleGoogle Cloud .
Per un logging più avanzato, utilizza le librerie client di Cloud Logging.
Per impostazione predefinita, il payload del log è una semplice stringa di testo, come mostrato nei seguenti snippet. La stringa viene memorizzata nel campo textPayload della voce di log.
Node.js
La maggior parte delle voci di log non ha un livello di log associato. Sono inclusi:- I log emessi utilizzando
console.log(),console.info(),console.warn()oconsole.error() - I log scritti direttamente in
stdoutostderr
I messaggi di sistema interni hanno il livello di log DEBUG.
Python
- I log di output standard o di errore standard non hanno un livello di log associato.
- I messaggi di sistema interni hanno il livello di log
DEBUG.
Go
- I log in
stdoutostderrnon hanno un livello di log associato. - I messaggi di sistema interni hanno il livello di log
DEBUG.
Java
- I log in
stdoutostderrnon hanno un livello di log associato. - I messaggi di sistema interni hanno il livello di log
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); } }
- Il testo scritto in
stdout(ad esempio tramiteConsole.WriteLine) estderr(ad esempio tramiteConsole.Error.WriteLine) non ha un livello di log. - I livelli di logging di ASP.NET Core sono mappati ai livelli di Cloud Logging nel seguente modo:
LogLevel.TraceeLogLevel.Debug mapaDEBUGdi Cloud Logging.LogLevel.Informationviene mappato aINFOdi Cloud Logging.LogLevel.Warningviene mappato aWARNINGdi Cloud Logging.LogLevel.Errorviene mappato aERRORdi Cloud Logging.LogLevel.Criticalviene mappato aCRITICALdi Cloud Logging.
Ruby
Le voci di log non hanno un livello di log associato.
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 ''; }
Scrittura di log strutturati
I log di testo predefiniti descritti sopra non hanno un livello di log associato.
Se vuoi includere livelli di log o altri campi specifici nelle voci di log, puoi scrivere i log in stdout o stderr sotto forma di una singola riga con serializzazione JSON. Questa riga viene acquisita e analizzata da Cloud Run Functions e viene inserita nel campo jsonPayload anziché textPayload. Gli snippet riportati di seguito mostrano come scrivere log strutturati.
Node.js
Python
Il supporto del logging strutturato è disponibile in Python 3.8 e versioni successive.
Go
La struttura di ogni voce di log è fornita da un tipo Entry:
Quando viene registrato uno struct di voci, viene chiamato il metodo String per eseguirne il marshalling nel formato JSON previsto da Cloud Logging:
Java
Abilita la registrazione JSON con Logback e SLF4J abilitando Logstash JSON Encoder nella configurazione di logback.xml.
Elaborazione di campi JSON speciali nei messaggi
Quando fornisci dati strutturati come dizionario JSON, alcuni campi speciali vengono rimossi da jsonPayload e scritti nel campo corrispondente della LogEntry generata, come descritto nella documentazione relativa ai campi speciali.
Ad esempio, se il file JSON include una proprietà severity, questa viene rimossa da jsonPayload e viene visualizzata come severity della voce di log. La proprietà message viene utilizzata come testo di visualizzazione principale della voce di log, se presente.
Scrittura dei log utilizzando le librerie client
Le librerie client di Cloud Logging forniscono un modo alternativo per scrivere i log. Con queste librerie puoi utilizzare i meccanismi di logging standard del tuo linguaggio di programmazione e integrarli con vari framework di logging supportati. Le librerie client semplificano anche la compilazione dei campi JSON speciali acquisendo automaticamente alcune informazioni e fornendo interfacce per popolare i campi in modo appropriato.
Puoi utilizzare le librerie client per scrivere log con l'API Cloud Logging in modo sincrono o asincrono. Alcune librerie client supportano anche la scrittura di log strutturati direttamente in stdout o stderr. Tieni presente che se scrivi i log in modo asincrono, la terminazione imprevista della funzione potrebbe comportare la perdita di voci di log.
Tieni presente inoltre che il logging sincrono con l'API Logging aumenta il tempo di esecuzione della funzione perché richiede l'attesa del completamento delle chiamate API.
Visualizzazione dei log di runtime
Questa sezione descrive le opzioni per visualizzare i log di runtime.
Utilizzo dello strumento a riga di comando
I log per Cloud Run Functions sono visualizzabili nell'interfaccia utente di Cloud Logging e utilizzando Google Cloud CLI.
Per visualizzare i log con gcloud CLI, utilizza il comando gcloud functions logs read:
gcloud functions logs read
Per visualizzare i log di una funzione specifica, fornisci il nome della funzione come argomento:
gcloud functions logs read FUNCTION_NAME
Utilizza quanto segue per visualizzare i log di un'esecuzione specifica:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
Per l'intera gamma di opzioni di visualizzazione dei log, consulta la documentazione di gcloud functions logs read.
Utilizzo della dashboard Logging
Puoi visualizzare i log di runtime per Cloud Run Functions anche nella consoleGoogle Cloud .
Utilizzo dell'API Logging
I log di runtime possono anche essere scritti e recuperati tramite l'API Cloud Logging. Le librerie client di Cloud Logging forniscono un'interfaccia idiomatica per l'API Logging:
Node.js
Per saperne di più, consulta il riferimento della libreria client Node.js.Python
Per saperne di più, consulta il riferimento della libreria client Python.Go
Per saperne di più, consulta il riferimento della libreria client Go.Java
Per saperne di più, consulta il riferimento della libreria client Java.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); } }
Per ulteriori opzioni di logging per Java, consulta Logging Java.
Risposta ai log di runtime
Puoi rispondere agli eventi di Cloud Logging inoltrando i relativi log a una funzione Cloud Run. Per saperne di più, consulta la pagina Trigger di seconde parti con Cloud Logging.
Visualizzazione dei log di creazione delle immagini
Puoi anche visualizzare i log del passaggio di creazione dell'immagine del processo di deployment. Per saperne di più, segui il link.