猿问

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

我为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"

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

无论通过

resource.type="gae_app" resource.labels.module_id="default"

或者 gcloud 命令

 gcloud app logs tail -s default


四季花海
浏览 112回答 2
2回答

隔江千里

如果您希望日志出现在 Stackdriver Logging 中,正确的方法是使用“google.golang.org/appengine/log”包。但是,根据Go1.11 运行时的文档,建议不要使用 App Engine 特定的 API 并使用 Google Cloud 客户端库。关于日志记录,这意味着不使用“google.golang.org/appengine/log”,推荐的方法是使用“log”包。一个例子:应用程序.yamlruntime: go111你好去package mainimport (        "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!")}此日志将显示在 Stackdriver Logging 中的以下位置:resource.type="gae_app"resource.labels.module_id="default"logName="projects/<YOUR_PROJECT_NAME>/logs/stderr"stderr或者通过在日志过滤器下拉列表中选择。但是,如果您愿意,您仍然可以使用“google.golang.org/appengine/log”包,但您还必须添加“google.golang.org/appengine”包,并将入口点添加appengine.Main()到main()功能。

繁花如伊

您也可以采用结构化日志记录路线,您不依赖于上述客户端库。// Entry defines a log entry.type Entry struct {    Message  string `json:"message"`    Severity string `json:"severity,omitempty"`    Trace    string `json:"logging.googleapis.com/trace,omitempty"`    // Cloud Log Viewer allows filtering and display of this as `jsonPayload.component`.    Component string `json:"component,omitempty"`}// String renders an entry structure to the JSON format expected by Cloud Logging.func (e Entry) String() string {    if e.Severity == "" {        e.Severity = "INFO"    }    out, err := json.Marshal(e)    if err != nil {        log.Printf("json.Marshal: %v", err)    }    return string(out)}然后使用内置log包登录:log.Println(Entry{        Severity:  "NOTICE",        Message:   "This is the default display field.",        Component: "arbitrary-property",        Trace:     trace,    })
随时随地看视频慕课网APP

相关分类

Go
我要回答