簡體   English   中英

如何在 Cloud Run 上使用 Stackdriver 日志記錄

[英]How to use Stackdriver logging on Cloud Run

我正在嘗試讓 stackdriver 日志記錄適用於在 Google Cloud Run(完全托管)中運行的簡單 Go 應用程序,但在 CloudRun 日志中看不到 stackdriver 條目。

我基於“官方”stackdriver golang 示例創建了最簡單的演示應用程序

Cloud Run 文檔指出不應執行任何其他操作來寫入堆棧驅動程序日志

我的服務使用默認服務帳戶

我正在使用 Go 1.13 編譯代碼(Dockerfile 是從Cloud Run 示例“按原樣”復制的)

我試圖將它部署到不同的區域,但沒有成功

在本地運行容器時,使用服務帳戶憑據,堆棧驅動程序日志消息不會出現在本地終端或堆棧驅動程序控制台中

無論如何,在應用程序啟動時,我只看到"Before stackdriver logging" ,然后是"After stackdriver logging" ,中間沒有其他消息\錯誤

日志視圖截圖

這是日志記錄代碼的一部分(使用上面的鏈接獲取完整源代碼、Dockerfile 以及構建和運行應用程序的說明):

import (
    "context"
    "log"
    "os"
    ...

    "cloud.google.com/go/compute/metadata"
    "cloud.google.com/go/logging"
)

func main() {
    loggingClient, err := stackdriverClient()
    ...
    log.Println("Before stackdriver logging")
    logger.StandardLogger(logging.Info).Println("Stackdriver log")
    if err = logger.Flush(); err != nil {
        log.Fatalf("Failed to flush client: %v", err)
    }
    if err = loggingClient.Close(); err != nil {
        log.Fatalf("Failed to close client: %v", err)
    }
    log.Println("After stackdriver logging")
    ...
}

func stackdriverClient() (client *logging.Client, err error) {
    var projectID string
    if projectID, err = metadata.ProjectID(); err == nil {
        client, err = logging.NewClient(context.Background(), projectID)
    }
    return
}

原來日志條目寫入成功
但是logviewer web UI中的默認 Cloud Run 過濾器不包括它們
下面的過濾器表達式為我工作以獲取所有日志:

resource.type = "project" OR resource.type = "cloud_run_revision"

(服務名稱、位置、嚴重性省略)
合成日志截圖

"stdout\stderr" 日志條目匹配resource.type="cloud_run_revision" ,而 stackdriver 日志條目匹配resource.type="project"

更新:我在 google tracker 中為此創建了一張票

由於 Cloud Run 已與 Cloud Logging 集成,因此無需使用 Go 客戶端庫。 我們在 Cloud Run 上運行所有 gRPC 服務,並使用以下內容確保日志在 Cloud Logging 中的格式正確:

package main

import (
    "github.com/rs/zerolog"
    "github.com/rs/zerolog/log"
    "os"
)

// initializeLogging sets up the logging configuration for the service.
// Invoke this method in your Init() method.
func initializeLogging() {
    // Set logging options for production development
    if os.Getenv("ENV") != "DEV" {
        // change the level field name to ensure these are parsed correctly in Stackdriver
        zerolog.LevelFieldName = "severity"
        // UNIX Time is faster and smaller than most timestamps
        zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
    } else {
        // Set logging options for local development
        log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
        zerolog.SetGlobalLevel(zerolog.DebugLevel)
    }
    
    // Example log
    log.Info().Msg("This is how you log at Info level")
}

然后很好地顯示日志以供本地開發使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM