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

有没有办法在开发/测试环境中使用 cloud.google.com/go/logging

有没有办法在开发/测试环境中使用 cloud.google.com/go/logging

Go
海绵宝宝撒 2022-10-04 16:03:53
不过,我是关于“隐藏”记录器初始化,并在开发环境中运行代码时从中返回一个正常的记录器(),并在GCP上部署时返回一个记录器()。logcloud.google.com/go/logging但是 logger 没有与 相同的接口,因此它需要一些额外的包装,我希望我能避免这种情况。cloud.google.com/go/logginglog查看文档,我找不到执行此操作的标准方法。如果没有办法做到这一点,那么避免垃圾邮件Google云日志记录的常用方法是什么,日志不是来自预生产/生产环境?除了使日志变得嘈杂之外,日志引入还有我想在某些情况下避免的成本。
查看完整描述

3 回答

?
不负相思意

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

除了@Sergiusz答案之外,您还可以将开发记录到具有模板化名称的相同日志中,并使用 logadmin 包按名称删除日志。您可以在执行结束时,在计划的进程中或从命令行执行此操作。您也可以使用命令执行此操作。如果您有多个日志,则需要在每个日志中多次调用“删除”。gcloud logging logs delete

但是,我建议改为模拟包,因为使用它可能会耗尽您在开发项目上的API配额。因此,如果将日志写入 STDOUT 就足够了,那么最快的方法就是模拟记录器类型。

附言:我建议在 https://github.com/googleapis/google-cloud-go 您的用例中打开一个问题并要求进行更改。不过,这可能会导致重大更改,但提供反馈仍然很重要。


查看完整回答
反对 回复 2022-10-04
?
一只名叫tom的猫

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

回顾一下评论:
谷歌云允许为接收器创建排除过滤器。根据谷歌文档

您可以选择将日志导出到BigQuery,云存储或云发布/订阅,而无需付费将它们提取到堆栈驱动程序中。您甚至可以使用排除筛选器来收集一定比例的日志,例如 1% 的成功 HTTP 响应。

此外,请注意,每个项目每月的前 50 GiB 日志是免费的 1
日志存储桶中的前 30 天存储也是免费的。


查看完整回答
反对 回复 2022-10-04
?
喵喔喔

TA贡献1735条经验 获得超5个赞

最后,正如@leo-y所建议的那样,我有点嘲笑了一个记录器,并将实现细节隐藏在接口后面。我不愿意这样做,因为我是golang的新手,但最终这不是那么多的代码:


logging/Logger.go:


package logging


// Logger is just an interface to abstract away what

// kind of logger we return on initialization

type Logger interface {

    LogInfo(string)

    LogWarning(string)

    LogError(string)

    Close()

}

日志记录/初始化/日志记录.


package initialization


import (

    "context"

    "log"


    customLogging "organization/module-name/logging"


    "cloud.google.com/go/logging"

    "google.golang.org/api/option"

)


// GetLogger return a logging client

func GetLogger(onCloud bool) customLogging.Logger {

    if onCloud {

        return getLoggerGCP()

    }

    return loggerConsole{}

}


func getLoggerGCP() loggerGCP {

    ctx := context.Background()

    projectID := "PROJECT-ID"

    client, err := logging.NewClient(ctx, projectID, option.WithCredentialsFile("/path/to/credentials.json"))

    if err != nil {

        log.Fatalf("Failed to create logging client: %v", err)

    }

    return loggerGCP{

        client: client,

        logger: client.Logger("logs-name"),

    }

}


type loggerGCP struct {

    client *logging.Client

    logger *logging.Logger

}


type loggerConsole struct {

}


func (logger loggerGCP) LogInfo(s string) {

    stdlogger := logger.logger.StandardLogger(logging.Info)

    stdlogger.Println(s)

}


func (logger loggerGCP) LogWarning(s string) {

    stdlogger := logger.logger.StandardLogger(logging.Warning)

    stdlogger.Println(s)

}


func (logger loggerGCP) LogError(s string) {

    stdlogger := logger.logger.StandardLogger(logging.Error)

    stdlogger.Println(s)

}


func (logger loggerGCP) Close() {

    logger.client.Close()

}


func (logger loggerConsole) LogInfo(s string) {

    log.Printf("INFO: %s\n", s)

}


func (logger loggerConsole) LogWarning(s string) {

    log.Printf("WARNING: %s\n", s)

}


func (logger loggerConsole) LogError(s string) {

    log.Printf("ERROR: %s\n", s)

}


func (logger loggerConsole) Close() {

}

主要.go


package main


import (

    "organization/module-name/logging/initialization"

)


func main() {

    logger := initialization.GetLogger(false)

    defer logger.Close()

    logger.LogInfo("hello")

}

我还没有对代码提出太多挑战,所以也许它会有一些怪癖。


查看完整回答
反对 回复 2022-10-04
  • 3 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

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