[英]How to log a error to Stackdriver Error Reporting via Stackdriver Logging
[英]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"
由於 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.