我为GAE找到了两种Go库:
我应该使用哪个? 顺便说一下,我在我的应用程序中同时使用了两个日志库。 在本地开发人员模式下,我可以看到这样的日志。
2019/01/08 06:57:34 INFO: Search keyword="test" idOnly=bool
2019/01/08 06:57:34 INFO: Search:"test"
但是当我部署到生产GAE时,我看不到任何日志。
无论
使用stackdriverresource.type="gae_app" resource.labels.module_id="default"
或gcloud命令
gcloud app logs tail -s default
答案 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