Ver y escribir registros de funciones de Cloud Run
Escribir registros del entorno de ejecución
Cloud Run Functions incluye de forma predeterminada un registro de tiempo de ejecución sencillo. Los registros escritos en stdout
o stderr
aparecerán automáticamente en la Google Cloud consola.
Para registrar información de forma más avanzada, usa las bibliotecas de cliente de Cloud Logging.
De forma predeterminada, la carga útil del registro es una cadena de texto sencilla, como se muestra en los siguientes fragmentos de código. La cadena se almacena en el campo textPayload
de la entrada de registro.
Node.js
La mayoría de las entradas de registro no tienen un nivel de registro asociado. Por ejemplo:- Registros emitidos con
console.log()
,console.info()
,console.warn()
oconsole.error()
- Registros escritos directamente en
stdout
ostderr
Los mensajes internos del sistema tienen el nivel de registro DEBUG
.
Python
- Los registros de salida estándar o de error estándar no tienen un nivel de registro asociado.
- Los mensajes internos del sistema tienen el nivel de registro
DEBUG
.
Go
- Los registros de
stdout
ostderr
no tienen ningún nivel de registro asociado. - Los mensajes internos del sistema tienen el nivel de registro
DEBUG
.
Java
- Los registros de
stdout
ostderr
no tienen ningún nivel de registro asociado. - Los mensajes internos del sistema tienen el nivel de registro
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); } }
- El texto escrito en
stdout
(por ejemplo, a través deConsole.WriteLine
) ystderr
(por ejemplo, a través deConsole.Error.WriteLine
) no tiene un nivel de registro. - Los niveles de registro de ASP.NET Core se asignan a los niveles de Cloud Logging de la siguiente manera:
LogLevel.Trace
yLogLevel.Debug map
a Cloud LoggingDEBUG
.LogLevel.Information
se asigna a Cloud LoggingINFO
.LogLevel.Warning
se asigna a Cloud LoggingWARNING
.LogLevel.Error
se asigna a Cloud LoggingERROR
.LogLevel.Critical
se asigna a Cloud LoggingCRITICAL
.
Ruby
Las entradas de registro no tienen ningún nivel de registro asociado.
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 ''; }
Escribir registros estructurados
Los registros de texto predeterminados descritos anteriormente no tienen ningún nivel de registro asociado.
Si quieres incluir niveles de registro u otros campos específicos en tus entradas de registro, puedes escribir registros en stdout
o stderr
en forma de una sola línea de JSON serializado. Las funciones de Cloud Run recogen y analizan esta línea, y la colocan en el campo jsonPayload
en lugar de en textPayload
. En los fragmentos de código de abajo se muestra cómo escribir registros estructurados de este tipo.
Node.js
Python
La compatibilidad con el registro estructurado está disponible en Python 3.8 y versiones posteriores.
Go
La estructura de cada entrada de registro se proporciona mediante un tipo Entry
:
Cuando se registra una estructura Entry, se llama al método String
para serializarla en el formato JSON que espera Cloud Logging:
Java
Para habilitar el registro JSON con Logback y SLF4J, habilita Logstash JSON Encoder en tu configuración de logback.xml
.
Procesar campos JSON especiales en mensajes
Cuando proporcionas datos estructurados como un diccionario JSON, se eliminan algunos campos especiales del jsonPayload
y se escriben en el campo correspondiente del LogEntry
generado, tal como se describe en la documentación sobre campos especiales.
Por ejemplo, si tu JSON incluye una propiedad severity
, se elimina del jsonPayload
y aparece como severity
de la entrada de registro. La propiedad message
se usa como texto principal de la entrada de registro, si está presente.
Escribir registros con bibliotecas de cliente
Las bibliotecas de cliente de Cloud Logging ofrecen una forma alternativa de escribir registros. Con estas bibliotecas, puedes usar los mecanismos de registro estándar de tu lenguaje de programación e integrarlos con varios frameworks de registro compatibles. Las bibliotecas de cliente también simplifican el proceso de rellenar los campos JSON especiales, ya que capturan automáticamente cierta información y proporcionan interfaces para rellenar los campos de forma adecuada.
Puedes usar bibliotecas de cliente para escribir registros con la API Cloud Logging de forma síncrona o asíncrona. Algunas bibliotecas de cliente también permiten escribir registros estructurados directamente en stdout
o stderr
. Ten en cuenta que, si escribes registros de forma asíncrona, es posible que se pierdan entradas de registro si la función finaliza de forma inesperada.
Ten en cuenta también que el registro síncrono con la API de Logging aumenta el tiempo de ejecución de las funciones, ya que requiere esperar a que se completen las llamadas a la API.
Ver registros del entorno de ejecución
En esta sección se describen las opciones que tiene para ver los registros de tiempo de ejecución.
Usar la herramienta de línea de comandos
Los registros de las funciones de Cloud Run se pueden ver en la interfaz de usuario de Cloud Logging y con la CLI de Google Cloud.
Para ver los registros con gcloud CLI, usa el comando
gcloud functions logs read
:
gcloud functions logs read
Para ver los registros de una función específica, proporciona el nombre de la función como argumento:
gcloud functions logs read FUNCTION_NAME
Para ver los registros de una ejecución específica, haz lo siguiente:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
Para ver todas las opciones de visualización de registros, consulta la documentación de gcloud functions logs read
.
Usar el panel de control de Logging
También puedes ver los registros de tiempo de ejecución de las funciones de Cloud Run en la Google Cloud consola.
Usar la API Logging
Los registros del tiempo de ejecución también se pueden escribir y recuperar a través de la API de Cloud Logging. Las bibliotecas de cliente de Cloud Logging ofrecen una interfaz idiomática para la API Logging:
Node.js
Para obtener más información, consulta la referencia de la biblioteca de cliente de Node.js.Python
Para obtener más información, consulta la referencia de la biblioteca de cliente de Python.Go
Para obtener más información, consulta la referencia de la biblioteca de cliente de Go.Java
Para obtener más información, consulta la referencia de la biblioteca de cliente de 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 otras opciones de registro de Java, consulta Registro de Java.
Responder a registros del entorno de ejecución
Puedes responder a eventos de Cloud Logging reenviando sus registros a una función de Cloud Run. Para obtener más información, consulta la página Activadores de terceros con Cloud Logging.
Ver registros de imágenes de compilación
También puedes ver los registros del paso Crear imagen del proceso de implementación. Haz clic en el enlace para obtener más información.