Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 对于Go in GAE,我应该使用哪个日志库?_Google App Engine_Go_Google Cloud Platform - Fatal编程技术网

Google app engine 对于Go in GAE,我应该使用哪个日志库?

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时,

我发现这是一种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时,我看不到任何日志

    无论使用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出现。