我应该在GAE中使用哪个日志库?

时间:2019-01-08 07:29:13

标签: 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"

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

无论

使用stackdriver
resource.type="gae_app" resource.labels.module_id="default" 

或gcloud命令

 gcloud app logs tail -s default

2 个答案:

答案 0 :(得分:3)

如果您希望日志显示在Stackdriver Logging中,则正确的方法是使用"google.golang.org/appengine/log" package

但是,根据documentation on the Go1.11 runtime,建议使用not to use the App Engine specific API's and use the Google Cloud client library

关于日志记录,这意味着,除了使用“ google.golang.org/appengine/log”之外,建议的方法是使用"log" package。一个例子:

app.yaml

runtime: go111

hello.go

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!")
}

此日志将显示在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()入口点。

答案 1 :(得分:1)

您也可以走 structured logging 路线,在那里您不依赖于上述客户端库。

// 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,
    })

这是一个完整的例子:https://github.com/GoogleCloudPlatform/golang-samples/blob/master/run/logging-manual/main.go