Google app engine 对于Go in GAE,我应该使用哪个日志库?
我发现这是一种GAE的go图书馆:Google app engine 对于Go in GAE,我应该使用哪个日志库?,google-app-engine,go,google-cloud-platform,Google App Engine,Go,Google Cloud Platform,我发现这是一种GAE的go图书馆: “google.golang.org/appengine/log” “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时,
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
如果希望日志显示在Stackdriver日志中,正确的方法是使用 但是,根据标准,建议使用 关于日志记录,这意味着不使用“google.golang.org/appengine/log”,建议的方法是使用。例如: 应用程序yaml
runtime: go111
你好,开始
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日志中的以下位置:
resource.type="gae_app"
resource.labels.module_id="default"
logName="projects/<YOUR_PROJECT_NAME>/logs/stderr"
resource.type=“gae\u应用程序”
resource.labels.module_id=“默认”
logName=“项目//日志/stderr”
或者在日志过滤器下拉列表中选择stderr
但是,如果您愿意,您仍然可以使用“google.golang.org/appengine/log”包,但是您还必须添加“google.golang.org/appengine”包,并在Main()
函数中添加appengine.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,
})
下面是一个完整的示例:您使用的是什么版本的Go?(检查命令的输出
go version
)我的go版本go111实际上,我在Main()函数中使用了带有appengine.Main()入口点的“google.golang.org/appengine/log”包。我将尝试使用“日志”。我还有一个问题,为什么不使用App Engine搜索API,而是在Compute Engine上托管任何全文搜索数据库,如ElasticSearch,并从您的服务访问它?App Engine Search API将被弃用?原因是App Engine Search API目前仅在Python2.7、Java 8和Go 1.9运行时中可用(并且仅在App Engine Standard中可用)。但使用Go的标准日志库无法区分日志级别,如严重、错误、警告、信息和调试。使用cloud.google.com/go/logging编写服务会使您无法使用GAE。稍后,如果我们希望切换到GCE或Kubernetes,每个人都有自己的日志约定。我希望有一种方法可以将stdout和stderr日志作为前缀来表示日志级别,这样就可以在StackDriver日志查看器中对其进行过滤。更好的方法是跨所有平台使用标准日志记录方法。@Andyfuniak我为我的项目创建了一个util包,该包封装了google.golang.org/appengine/log
包的基本功能,并在所有日志前加上一个-DEBUG-
,从而部分解决了这个问题,-ERROR-
或-INFO-
。我知道这是一个老问题,但可能对某些人有帮助。我尝试了这个方法,但在谷歌应用引擎日志中,它没有被分配适当的严重性级别,只是在默认严重性中作为JSON出现。