为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
四季花海 2023-06-01 09:56:14
我为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 时,我看不到任何日志。无论通过resource.type="gae_app" resource.labels.module_id="default"或者 gcloud 命令 gcloud app logs tail -s default
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

如果您希望日志出现在 Stackdriver Logging 中,正确的方法是使用“google.golang.org/appengine/log”包。

但是,根据Go1.11 运行时的文档,建议不要使用 App Engine 特定的 API 并使用 Google Cloud 客户端库。

关于日志记录,这意味着不使用“google.golang.org/appengine/log”,推荐的方法是使用“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 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()功能。


查看完整回答
反对 回复 2023-06-01
?
繁花如伊

TA贡献2012条经验 获得超12个赞

您也可以采用结构化日志记录路线,您不依赖于上述客户端库。

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

    })

查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信