如何在 Cloud Run 上使用 Stackdriver 日志记录

Med*_* V. 7 logging go gcloud google-cloud-stackdriver google-cloud-run

我正在尝试让 Stackdriver 日志记录适用于在 Google Cloud Run(完全托管)中运行的简单 Go 应用程序,但在 CloudRun 日志中看不到 stackdriver 条目。

我已经基于“官方”stackdriver golang 示例创建了最简单的演示应用程序

Cloud Run 文档指出不应执行其他操作来写入堆栈驱动程序日志

我的服务使用默认服务帐户

我正在使用 Go 1.13 编译代码(Dockerfile 是从Cloud Run 示例“按原样”复制的)

我试图将它部署到不同的地区,但没有成功

在本地运行容器时,使用服务帐户凭据,本地终端或 stackdriver 控制台中不会出现 stackdriver 日志消息

无论如何,在应用程序启动时,我只看到"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
}
Run Code Online (Sandbox Code Playgroud)

Med*_* V. 7

事实证明,日志条目已成功写入
logviewer Web UI中的默认 Cloud Run 过滤器不包含它们,
下面的过滤器表达式对我有用以获取所有日志:

resource.type = "project" OR resource.type = "cloud_run_revision"
Run Code Online (Sandbox Code Playgroud)

(省略服务名称、位置、严重性)
合成日志截图

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

更新:我在谷歌跟踪器中为此创建了一张票