Ver e escrever registos de funções do Cloud Run
Escrever registos do tempo de execução
As funções do Cloud Run incluem o registo de tempo de execução simples por predefinição. Os registos escritos em stdout
ou stderr
aparecem automaticamente na consola Google Cloud .
Para um registo mais avançado, use as bibliotecas de cliente do Cloud Logging.
Por predefinição, a carga útil do registo é uma string de texto simples, conforme mostrado nos fragmentos
seguintes. A string é armazenada no campo textPayload
da entrada do registo.
Node.js
A maioria das entradas de registo não tem um nível de registo associado. Por exemplo:- Registos emitidos através de
console.log()
,console.info()
,console.warn()
ouconsole.error()
- Registos escritos diretamente em
stdout
oustderr
As mensagens internas do sistema têm o nível de registo DEBUG
.
Python
- Os registos para a saída padrão ou o erro padrão não têm um nível de registo associado.
- As mensagens internas do sistema têm o nível de registo
DEBUG
.
Go
- Os registos para
stdout
oustderr
não têm um nível de registo associado. - As mensagens internas do sistema têm o nível de registo
DEBUG
.
Java
- Os registos para
stdout
oustderr
não têm um nível de registo associado. - As mensagens internas do sistema têm o nível de registo
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); } }
- O texto escrito para
stdout
(por exemplo, através deConsole.WriteLine
) estderr
(por exemplo, através deConsole.Error.WriteLine
) não tem um nível de registo. - Os níveis de registo do ASP.NET Core são mapeados para os níveis do Cloud Logging da seguinte forma:
LogLevel.Trace
eLogLevel.Debug map
para o Cloud LoggingDEBUG
.LogLevel.Information
mapeia para o Cloud LoggingINFO
.LogLevel.Warning
mapeia para o Cloud LoggingWARNING
.LogLevel.Error
mapeia para o Cloud LoggingERROR
.LogLevel.Critical
mapeia para o Cloud LoggingCRITICAL
.
Ruby
As entradas do registo não têm um nível de registo associado.
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 ''; }
Escrever registos estruturados
Os registos de texto predefinidos descritos acima não têm um nível de registo associado.
Se quiser incluir níveis de registo ou outros campos específicos nas suas entradas de registo, pode escrever registos para stdout
ou stderr
no formato de uma única linha de JSON serializado. Esta linha é recolhida e analisada pelas funções do Cloud Run e é colocada no campo jsonPayload
em vez de textPayload
. Os fragmentos abaixo demonstram como escrever esses registos estruturados.
Node.js
Python
O suporte de registo estruturado está disponível no Python 3.8 e posteriores.
Go
A estrutura de cada entrada de registo é fornecida por um tipo Entry
:
Quando uma estrutura de entrada é registada, o método String
é chamado para a serializar no formato JSON esperado pelo Cloud Logging:
Java
Ative o registo JSON com o Logback e o SLF4J
ativando o codificador JSON do Logstash
na sua configuração logback.xml
.
Processamento de campos JSON especiais em mensagens
Quando fornece dados estruturados como um dicionário JSON, alguns campos especiais são
removidos do jsonPayload
e são escritos no campo correspondente no
LogEntry
gerado, conforme
descrito na documentação para campos especiais.
Por exemplo, se o seu JSON incluir uma propriedade severity
, esta é removida do
jsonPayload
e aparece, em alternativa, como o severity
da entrada do registo. A propriedade message
é usada como o texto de apresentação principal da entrada do registo, se estiver presente.
Escrever registos através de bibliotecas de cliente
As bibliotecas cliente do Cloud Logging oferecem uma forma alternativa de escrever registos. Com estas bibliotecas, pode usar os mecanismos de registo padrão da sua linguagem de programação e integrar-se com várias estruturas de registo suportadas. As bibliotecas de cliente também simplificam o preenchimento dos campos JSON especiais capturando automaticamente algumas informações e fornecendo interfaces para preencher os campos adequadamente.
Pode usar bibliotecas cliente para escrever registos com a API Cloud Logging de forma síncrona ou assíncrona. Algumas bibliotecas cliente também suportam a escrita de registos estruturados diretamente no stdout
ou no stderr
. Tenha em atenção que, se escrever registos de forma assíncrona, a terminação inesperada da função pode resultar na perda de entradas de registo.
Tenha também em atenção que o registo síncrono com a API Logging aumenta o tempo de execução da função porque requer que se aguarde a conclusão das chamadas API.
Ver registos do tempo de execução
Esta secção descreve as suas opções para ver registos de tempo de execução.
Usar a ferramenta de linha de comandos
Os registos das funções do Cloud Run são visíveis na IU do Cloud Logging e através da CLI do Google Cloud.
Para ver registos com a CLI gcloud, use o comando
gcloud functions logs read
:
gcloud functions logs read
Para ver os registos de uma função específica, indique o nome da função como um argumento:
gcloud functions logs read FUNCTION_NAME
Use o seguinte para ver os registos de uma execução específica:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
Para ver a gama completa de opções de visualização de registos, consulte a documentação de
gcloud functions logs read
.
Usar o painel de controlo de registo
Também pode ver os registos de tempo de execução das funções do Cloud Run na Google Cloud consola.
Usar a API Logging
Também é possível escrever e obter registos de tempo de execução através da API Cloud Logging. As bibliotecas cliente do Cloud Logging oferecem uma interface idiomática para a API Logging:
Node.js
Para mais informações, consulte a referência da biblioteca de cliente do Node.js.Python
Para mais informações, consulte a referência da biblioteca cliente Python.Go
Para mais informações, consulte a referência da biblioteca de cliente Go.Java
Para mais informações, consulte a referência da biblioteca cliente 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); } }
Para ver opções de registo adicionais para Java, consulte o artigo Registo Java.
Responder a registos do tempo de execução
Pode responder a eventos do Cloud Logging encaminhando os respetivos registos para uma função do Cloud Run. Para mais informações, consulte a página Acionadores de origem com o Cloud Logging.
Ver registos de imagens de compilação
Também pode ver os registos do passo criar imagem do processo de implementação. Siga o link para mais informações.