Visualiza y escribe registros de la función de Cloud Run
Escribe registros del entorno de ejecución
De forma predeterminada, Cloud Run Functions incluye registros sencillos sobre el entorno de ejecución. Los registros que se escriban en stdout o
stderr aparecerán de forma automática en la
consola deGoogle Cloud .
Para obtener un registro más avanzado, usa las
bibliotecas cliente de Cloud Logging.
De forma predeterminada, la carga útil del registro es una cadena de texto simple, como se muestra en los siguientes fragmentos. 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. Estos incluyen los siguientes:- Registros emitidos con
console.log(),console.info(),console.warn()oconsole.error() - Registros escritos directamente en
stdoutostderr
Los mensajes internos del sistema tienen el nivel de registro DEBUG.
Python
- Los registros enviados a la salida estándar o al error estándar no tienen un nivel de registro asociado.
- Los mensajes internos del sistema tienen el nivel de registro
DEBUG.
Go
- Los registros escritos en
stdoutostderrno tienen un nivel de registro asociado. - Los mensajes internos del sistema tienen el nivel de registro
DEBUG.
Java
- Los registros escritos en
stdoutostderrno tienen un 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, conConsole.WriteLine) ystderr(por ejemplo, conConsole.Error.WriteLine) no tiene un nivel de registro. - Los niveles de registro de ASP.NET Core se mapean a los niveles de Cloud Logging de la siguiente manera:
LogLevel.TraceyLogLevel.Debug mapaDEBUGde Cloud LoggingLogLevel.Informationse mapea aINFOde Cloud LoggingLogLevel.Warningse mapea aWARNINGde Cloud LoggingLogLevel.Errorse mapea aERRORde Cloud LoggingLogLevel.Criticalse asigna aCRITICALde Cloud Logging.
Ruby
Las entradas de registro no tienen un 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 ''; }
Escribe registros estructurados
Los registros de texto predeterminados descritos con anterioridad no tienen un nivel de registro asociado.
Si deseas incluir niveles de registro o algún otro
campo específico en las entradas de registro, puedes escribir registros en stdout o stderr en el
formato de una sola línea con JSON serializado. Cloud Run Functions toma y analiza
esta línea y la coloca en el campo jsonPayload en lugar de
textPayload. Los siguientes fragmentos demuestran cómo escribir esos registros estructurados.
Node.js
Python
La compatibilidad con el registro estructurado está disponible en Python 3.8 y versiones posteriores.
Go
Un tipo de Entry proporciona la estructura para cada entrada de registro:
Cuando se registra un struct de Entry, se llama al método String para serializarla según el formato JSON que espera Cloud Logging:
Java
Para habilitar el registro JSON con Logback y SLF4J, debes habilitar el codificador de JSON de Logstash en la configuración logback.xml.
Procesa campos JSON especiales en mensajes
Cuando proporcionas datos estructurados como un diccionario JSON, algunos campos especiales se extraen de jsonPayload y se escriben en el campo correspondiente en el LogEntry generado, como se describe en la documentación de campos especiales.
Por ejemplo, si el JSON incluye una propiedad severity, se quita de jsonPayload y aparece como la severity de la entrada de registro. La propiedad message se usa como el texto de visualización principal de la entrada de registro, si está presente.
Escribe registros con bibliotecas cliente
Las bibliotecas cliente de Cloud Logging proporcionan una forma alternativa de escribir registros. Con estas bibliotecas, puedes usar los mecanismos de registro estándar de tu lenguaje de programación y, también, integrarlos en varios frameworks de registro compatibles. Las bibliotecas cliente también simplifican la propagación de los campos JSON especiales, ya que capturan información de forma automática y proporcionan interfaces para propagar correctamente los campos.
Puedes usar las bibliotecas cliente para escribir registros con la API de Cloud Logging
de forma síncrona o asíncrona. Algunas bibliotecas cliente también admiten la escritura
de registros estructurados directamente en stdout o stderr. Ten en cuenta que si escribes registros
de forma asíncrona, la finalización inesperada de funciones
puede provocar la pérdida de entradas de registro.
Además, ten en cuenta que el registro síncrono con la API de Logging aumenta
el tiempo de ejecución de la función, ya que requiere que se completen las
llamadas a la API.
Visualiza los registros del entorno de ejecución
En esta sección, se describen las opciones para ver los registros del entorno de ejecución.
Usa la herramienta de línea de comandos
Los registros de Cloud Run Functions se pueden ver en la IU de Cloud Logging y con Google Cloud CLI.
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 un argumento:
gcloud functions logs read FUNCTION_NAME
Usa el siguiente comando para ver los registros de una ejecución específica:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
Para ver el rango completo de opciones de visualización de registros, consulta la documentación de
gcloud functions logs read.
Usa el panel de Logging
También puedes ver los registros del entorno de ejecución de Cloud Run Functions en la consola deGoogle Cloud .
Usa la API de Logging
Los registros del entorno de ejecución también se pueden escribir y recuperar con la API de Cloud Logging. Las bibliotecas cliente de Cloud Logging proporcionan una interfaz idiomática a la API de Logging:
Node.js
Para obtener más información, consulta la referencia de la biblioteca cliente de Node.js.Python
Para obtener más información, consulta la referencia de la biblioteca cliente de Python.Go
Para obtener más información, consulta la referencia de la biblioteca cliente de Go.Java
Para obtener más información, consulta la referencia de la biblioteca 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); } }
Si quieres obtener más opciones de registro para Java, consulta Java Logging.
Responde los registros del entorno de ejecución
Para responder a los eventos de Cloud Logging reenvía sus registros a una función de Cloud Run. Para obtener más información, consulta la página Activadores secundarios con Cloud Logging.
Visualiza registros de compilación de imágenes
También puedes ver los registros del paso que abarca la compilación de imágenes del proceso de implementación. Consulta el vínculo para obtener más información.