我应该为 GAE 中的 Go 使用哪个日志库?

how*_*wie 3 google-app-engine go google-cloud-platform

我为 GAE 找到了两种 Go 库?

  1. “google.golang.org/appengine/log”
  2. “cloud.google.com/go/logging”

我应该使用哪一种?顺便说一下,我在我的应用程序中同时使用了两个日志库。在本地开发模式下,我可以看到这样的日志。

2019/01/08 06:57:34 INFO: Search keyword="test" idOnly=bool
2019/01/08 06:57:34 INFO: Search:"test"
Run Code Online (Sandbox Code Playgroud)

但是当我部署到生产 GAE 时,我看不到任何日志。

无论使用 stackdriver

resource.type="gae_app" resource.labels.module_id="default" 
Run Code Online (Sandbox Code Playgroud)

或者 gcloud 命令

 gcloud app logs tail -s default
Run Code Online (Sandbox Code Playgroud)

Joa*_*oël 5

如果您希望日志出现在 Stackdriver Logging 中,正确的方法是使用“google.golang.org/appengine/log”包

但是,根据Go1.11 运行时文档,建议不要使用 App Engine 特定的 API 并使用 Google Cloud 客户端库

关于日志记录,这意味着不使用“google.golang.org/appengine/log”,推荐的方法是使用“log”包。一个例子:

应用程序.yaml

runtime: go111
Run Code Online (Sandbox Code Playgroud)

你好去

package main

import (
        "fmt"
        "log"
        "net/http"
        "os"
)

func main() {
        http.HandleFunc("/", indexHandler)

        port := os.Getenv("PORT")
        if port == "" {
                port = "8080"
        }

        log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
        //Create the log and write it
        log.Printf("Hello world!")
        fmt.Fprint(w, "Log written in Stackdriver!")
}
Run Code Online (Sandbox Code Playgroud)

此日志将出现在 Stackdriver Logging 中:

resource.type="gae_app"
resource.labels.module_id="default"
logName="projects/<YOUR_PROJECT_NAME>/logs/stderr"
Run Code Online (Sandbox Code Playgroud)

或者通过stderr在日志过滤器下拉列表中选择。

但是,如果您愿意,您仍然可以使用“google.golang.org/appengine/log”包,但您还必须添加“google.golang.org/appengine”包,并appengine.Main()main()功能。

  • 但是通过使用 Go 的标准日志库,无法区分严重、错误、警告、信息和调试等日志级别。使用 cloud.google.com/go/logging 编写服务会锁定您使用 GAE。稍后,如果我们希望切换到 GCE 或 Kubernetes,每个人都有自己的日志记录约定。我希望有一种方法可以为 stdout 和 stderr 日志添加前缀来表示日志级别,因此可以在 StackDriver 日志查看器中对其进行过滤。更好的是跨所有平台的标准日志记录方法。 (3认同)