Visualizzare e scrivere i log delle funzioni Cloud Run
Scrittura dei log di runtime
Per impostazione predefinita, le funzioni Cloud Run includono un semplice logging di runtime. I log scritti in stdout
o
stderr
verranno visualizzati automaticamente nella
consoleGoogle 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 è memorizzata nel campo textPayload
della voce di log.
Node.js
La maggior parte delle voci di log non ha un livello di log associato. tra cui:- Log emessi utilizzando
console.log()
,console.info()
,console.warn()
oconsole.error()
- Log scritti direttamente in
stdout
ostderr
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
.
Vai
- I log in
stdout
ostderr
non hanno un livello di log associato. - I messaggi di sistema interni hanno il livello di log
DEBUG
.
Java
- I log in
stdout
ostderr
non 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.Trace
eLogLevel.Debug map
a Cloud LoggingDEBUG
.LogLevel.Information
viene mappato a Cloud LoggingINFO
.LogLevel.Warning
viene mappato a Cloud LoggingWARNING
.LogLevel.Error
viene mappato a Cloud LoggingERROR
.LogLevel.Critical
viene mappato a Cloud LoggingCRITICAL
.
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 di JSON serializzato. 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.
Vai
La struttura di ogni voce di log è fornita da un tipo Entry
:
Quando viene registrata una struct Entry, 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 del LogEntry
generato, come descritto nella documentazione relativa ai campi speciali.
Ad esempio, se il tuo 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 integrarti 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 compilare correttamente i campi.
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 relativa a
gcloud functions logs read
.
Utilizzare la dashboard Logging
Puoi anche visualizzare i log di runtime per le funzioni Cloud Run nella Google Cloud console.
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 all'API Logging:
Node.js
Per ulteriori informazioni, consulta il riferimento della libreria client Node.js.Python
Per saperne di più, consulta il riferimento della libreria client Python.Vai
Per saperne di più, consulta il riferimento alla libreria client Go.Java
Per saperne di più, consulta il riferimento alla 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.
Rispondere ai log di runtime
Puoi rispondere agli eventi di Cloud Logging inoltrando i relativi log a una funzione Cloud Run. Per ulteriori informazioni, consulta la pagina Trigger di seconde parti con Cloud Logging.
Visualizzazione dei log delle immagini di build
Puoi anche visualizzare i log del passaggio Crea immagine del processo di deployment. Per ulteriori informazioni, segui il link.