查看及寫入 Cloud Run 函式記錄檔
寫入執行階段記錄
Cloud Run functions 預設會包含簡易的執行階段記錄。寫入 stdout 或 stderr 的記錄檔會自動顯示在Google Cloud 控制台中。如需更進階的記錄功能,請使用 Cloud Logging 用戶端程式庫。
根據預設,記錄酬載是簡單的文字字串,如下列程式碼片段所示。字串會儲存在記錄項目的 textPayload 欄位中。
Node.js
大多數記錄項目都沒有相關聯的記錄層級。包括:- 使用
console.log()、console.info()、console.warn()或console.error()發出的記錄檔 - 直接寫入
stdout或stderr的記錄檔
內部系統訊息具有 DEBUG 記錄層級。
Python
- 標準輸出內容或標準錯誤的記錄檔沒有相關聯的記錄層級。
- 內部系統訊息具有
DEBUG記錄層級。
Go
- 寫入
stdout或stderr的記錄檔沒有相關聯的記錄檔層級。 - 內部系統訊息具有
DEBUG記錄層級。
Java
- 寫入
stdout或stderr的記錄檔沒有相關聯的記錄檔層級。 - 內部系統訊息具有
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); } }
- 寫入
stdout(例如透過Console.WriteLine) 和stderr(例如透過Console.Error.WriteLine) 的文字沒有記錄層級。 - ASP.NET Core 記錄層級與 Cloud Logging 層級的對應關係如下:
LogLevel.Trace和LogLevel.Debug map傳送至 Cloud LoggingDEBUG。LogLevel.Information對應至 Cloud LoggingINFO。LogLevel.Warning對應至 Cloud LoggingWARNING。LogLevel.Error對應至 Cloud LoggingERROR。LogLevel.Critical對應至 Cloud LoggingCRITICAL。
Ruby
記錄項目沒有相關聯的記錄層級。
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 ''; }
寫入結構化記錄檔
上述預設文字記錄沒有相關聯的記錄層級。如要在記錄項目中加入記錄層級或其他特定欄位,可以將記錄檔寫入 stdout 或 stderr,格式為單行序列化 JSON。Cloud Run functions 會擷取並剖析此行內容,然後將其置入 jsonPayload 欄位而非 textPayload。以下程式碼片段示範如何寫入這類結構化記錄檔。
Node.js
Python
Python 3.8 以上版本支援結構化記錄檔。
Go
每個記錄項目的結構都由 Entry 類型提供:
記錄 Entry struct 時,系統會呼叫 String 方法,將其封送至 Cloud Logging 預期的 JSON 格式:
Java
若要啟用 JSON 日誌功能,請在 logback.xml 設定中啟用 Logstash JSON Encoder,並搭配 Logback 與 SLF4J 使用。
處理訊息中的特殊 JSON 欄位
在以 JSON 字典形式提供結構化資料時,某些特殊欄位會從 jsonPayload 中移除,並如特殊欄位說明文件所述,寫入系統所產生 LogEntry 的對應欄位。
例如,若 JSON 含有 severity 屬性,系統會從 jsonPayload 將其移除,並改以記錄項目的 severity 形式顯示。如果存在 message 屬性,則會用作記錄項目的主要顯示文字。
使用用戶端程式庫寫入記錄檔
Cloud Logging 用戶端程式庫提供另一種記錄寫入方式。透過這些程式庫,您可以使用程式設計語言的標準記錄機制,並與各種支援的記錄架構進行整合。用戶端程式庫也會自動擷取部分資訊,並提供適當填寫介面,簡化特殊 JSON 欄位的填入作業。
您可以透過用戶端程式庫,使用 Cloud Logging API 以同步或非同步方式寫入記錄檔。部分用戶端程式庫也支援直接將結構化記錄寫入 stdout 或 stderr。請注意,如果以非同步方式寫入記錄,函式意外終止可能會導致記錄項目遺失。另請注意,使用 Logging API 進行同步記錄時,必須等待 API 呼叫完成,因此會增加函式執行作業時間。
查看執行階段記錄檔
本節說明查看執行階段記錄檔的選項。
使用指令列工具
您可透過 Cloud Logging 使用者介面和 Google Cloud CLI 查看 Cloud Run functions 的記錄檔。
如要使用 gcloud CLI 查看記錄檔,請使用 gcloud functions logs read 指令:
gcloud functions logs read
如要查看特定函式的記錄檔,請提供函式名稱做為引數:
gcloud functions logs read FUNCTION_NAME
如要查看特定執行作業的記錄檔,請使用下列方法:
gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID
如需完整的記錄檢視選項,請參閱 gcloud functions logs read 說明文件。
使用記錄資訊主頁
您也可以在Google Cloud 控制台查看 Cloud Run functions 的執行階段記錄。
使用 Logging API
您也可以透過 Cloud Logging API 寫入及擷取執行階段記錄檔。Cloud Logging 用戶端程式庫提供 Logging API 的慣用介面:
Node.js
詳情請參閱 Node.js 用戶端程式庫參考資料。Python
詳情請參閱 Python 用戶端程式庫參考資料。Go
詳情請參閱 Go 用戶端程式庫參考資料。Java
詳情請參閱 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); } }
如需 Java 的其他記錄選項,請參閱「Java Logging」。
回應執行階段記錄
如要回應 Cloud Logging 事件,可將其記錄檔轉送至 Cloud Run 函式。詳情請參閱「會使用 Cloud Logging 的第二方觸發條件」頁面。
查看建構映像檔的記錄檔
您也可以查看部署程序中建構映像檔步驟的記錄檔。詳情請參閱連結。