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

如何在 Cloud Run 上使用 Stackdriver 日志记录

如何在 Cloud Run 上使用 Stackdriver 日志记录

Go
喵喔喔 2023-08-07 10:56:34
我正在尝试让 stackdriver 日志记录在 Google Cloud Run(完全托管)中运行的简单 Go 应用程序正常工作,但在 CloudRun 日志中看不到 stackdriver 条目。我根据“官方”stackdriver golang 示例创建了最简单的演示应用程序Cloud Run 文档指出不应执行任何其他操作来写入 stackdriver 日志我的服务使用默认服务帐户我正在使用 Go 1.13 编译代码(Dockerfile 是从Cloud Run 示例“按原样”复制的)我尝试过将其部署到不同的地区,但没有成功使用服务帐户凭据在本地运行容器时,stackdriver 日志消息不会出现在本地终端或 stackdriver 控制台中无论如何,在应用程序启动时,我只看到"Before stackdriver logging"后面的内容,"After stackdriver logging"中间没有其他消息\错误以下是日志记录代码的一部分(使用上面的链接获取完整源代码、Dockerfile 以及构建和运行应用程序的说明):import (    "context"    "log"    "os"    ...    "cloud.google.com/go/compute/metadata"    "cloud.google.com/go/logging")func main() {    loggingClient, err := stackdriverClient()    ...    log.Println("Before stackdriver logging")    logger.StandardLogger(logging.Info).Println("Stackdriver log")    if err = logger.Flush(); err != nil {        log.Fatalf("Failed to flush client: %v", err)    }    if err = loggingClient.Close(); err != nil {        log.Fatalf("Failed to close client: %v", err)    }    log.Println("After stackdriver logging")    ...}func stackdriverClient() (client *logging.Client, err error) {    var projectID string    if projectID, err = metadata.ProjectID(); err == nil {        client, err = logging.NewClient(context.Background(), projectID)    }    return}
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

事实证明,日志条目已成功写入
,但logviewer Web UI中的默认 Cloud Run 过滤器不包含它们
下面的过滤器表达式可帮助我获取所有日志:

resource.type = "project" OR resource.type = "cloud_run_revision"

(服务名称、地点、严重程度省略)

https://img3.sycdn.imooc.com/64d05db2000199cf06100065.jpg

“stdout\stderr”日志条目匹配resource.type="cloud_run_revision",而 stackdriver 日志条目匹配resource.type="project"

查看完整回答
反对 回复 2023-08-07
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

由于 Cloud Run 已与 Cloud Logging 集成,因此无需使用 Go 客户端库。我们在 Cloud Run 上运行所有 gRPC 服务,并使用以下内容来确保 Cloud Logging 中的日志格式正确:


package main


import (

    "github.com/rs/zerolog"

    "github.com/rs/zerolog/log"

    "os"

)


// initializeLogging sets up the logging configuration for the service.

// Invoke this method in your Init() method.

func initializeLogging() {

    // Set logging options for production development

    if os.Getenv("ENV") != "DEV" {

        // change the level field name to ensure these are parsed correctly in Stackdriver

        zerolog.LevelFieldName = "severity"

        // UNIX Time is faster and smaller than most timestamps

        zerolog.TimeFieldFormat = zerolog.TimeFormatUnix

    } else {

        // Set logging options for local development

        log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})

        zerolog.SetGlobalLevel(zerolog.DebugLevel)

    }

    

    // Example log

    log.Info().Msg("This is how you log at Info level")

}


然后日志会很好地显示以供本地开发。


如果您不想使用任何第三方日志记录库,一个简单的方法是构造您自己的 Entry 对象。


package main


import (

    "context"

    "encoding/json"

    "fmt"

    "google.golang.org/grpc"

    "google.golang.org/grpc/metadata"

    "log"

    "os"

    "strings"

)


// LogSeverity is used to map the logging levels consistent with Google Cloud Logging.

type LogSeverity string


const (

    // LogSeverity_DEBUG Debug or trace information.

    LogSeverity_DEBUG LogSeverity = "DEBUG"

    // LogSeverity_INFO Routine information, such as ongoing status or performance.

    LogSeverity_INFO LogSeverity = "INFO"

    // LogSeverity_NOTICE Normal but significant events, such as start up, shut down, or

    // a configuration change.

    LogSeverity_NOTICE LogSeverity = "NOTICE"

    // LogSeverity_WARNING Warning events might cause problems.

    LogSeverity_WARNING LogSeverity = "WARNING"

    // LogSeverity_ERROR Error events are likely to cause problems.

    LogSeverity_ERROR LogSeverity = "ERROR"

    // LogSeverity_CRITICAL Critical events cause more severe problems or outages.

    LogSeverity_CRITICAL LogSeverity = "CRITICAL"

    // LogSeverity_ALERT A person must take an action immediately.

    LogSeverity_ALERT LogSeverity = "ALERT"

    // LogSeverity_EMERGENCY One or more systems are unusable.

    LogSeverity_EMERGENCY LogSeverity = "EMERGENCY"

)


// Entry defines a log entry.

// If logs are provided in this format, Google Cloud Logging automatically

// parses the attributes into their LogEntry format as per

// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry which then automatically

// makes the logs available in Google Cloud Logging and Tracing.

type Entry struct {

    Message  string      `json:"message"`

    Severity LogSeverity `json:"severity,omitempty"`

    Trace    string      `json:"logging.googleapis.com/trace,omitempty"`

    // To extend details sent to the logs, you may add the attributes here.

    //MyAttr1 string `json:"component,omitempty"`

}


// String renders an entry structure to the JSON format expected by Cloud Logging.

func (e Entry) String() string {


    // Defaults to INFO level.

    if e.Severity == "" {

        e.Severity = LogSeverity_INFO

    }


    // if Development is local then print out all logs

    if os.Getenv("ENV") == "LOCAL" {

        var prefix string

        switch e.Severity {

        case LogSeverity_DEBUG:

            prefix = colorize("DBG:      ", 90)

        case LogSeverity_INFO:

            prefix = colorize("INFO:     ", 32)

        case LogSeverity_NOTICE:

            prefix = colorize("NOTICE:   ", 34)

        case LogSeverity_WARNING:

            prefix = colorize("WARNING:  ", 33)

        case LogSeverity_ERROR:

            prefix = colorize("ERROR:    ", 31)

        case LogSeverity_ALERT:

            prefix = colorize("ALERT:    ", 91)

        case LogSeverity_CRITICAL:

            prefix = colorize("CRITICAL: ", 41)

        case LogSeverity_EMERGENCY:

            prefix = colorize("EMERGENCY:", 101)

        }

        return prefix + " " + e.Message

    } else {

        out, err := json.Marshal(e)

        if err != nil {

            log.Printf("json.Marshal: %v", err)

        }

        return string(out)

    }

}


// colorize returns the string s wrapped in ANSI code c

// Codes available at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

func colorize(s interface{}, c int) string {

    return fmt.Sprintf("\x1b[%dm%v\x1b[0m", c, s)

}


使用 Google Cloud 的特殊字段可以与其 Cloud Logging 产品更紧密地集成。



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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号