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

不过,我是关于“隐藏”记录器初始化,并在开发环境中运行代码时从中返回一个正常的记录器(),并在GCP上部署时返回一个记录器()。logcloud.google.com/go/logging

但是 logger 没有与 相同的接口,因此它需要一些额外的包装,我希望我能避免这种情况。cloud.google.com/go/logginglog

查看文档,我找不到执行此操作的标准方法。如果没有办法做到这一点,那么避免垃圾邮件Google云日志记录的常用方法是什么,日志不是来自预生产/生产环境?除了使日志变得嘈杂之外,日志引入还有我想在某些情况下避免的成本。


海绵宝宝撒
浏览 95回答 3
3回答

不负相思意

除了@Sergiusz答案之外,您还可以将开发记录到具有模板化名称的相同日志中,并使用 logadmin 包按名称删除日志。您可以在执行结束时,在计划的进程中或从命令行执行此操作。您也可以使用命令执行此操作。如果您有多个日志,则需要在每个日志中多次调用“删除”。gcloud logging logs delete但是,我建议改为模拟包,因为使用它可能会耗尽您在开发项目上的API配额。因此,如果将日志写入 STDOUT 就足够了,那么最快的方法就是模拟记录器类型。附言:我建议在 https://github.com/googleapis/google-cloud-go 您的用例中打开一个问题并要求进行更改。不过,这可能会导致重大更改,但提供反馈仍然很重要。

一只名叫tom的猫

回顾一下评论:谷歌云允许为接收器创建排除过滤器。根据谷歌文档:您可以选择将日志导出到BigQuery,云存储或云发布/订阅,而无需付费将它们提取到堆栈驱动程序中。您甚至可以使用排除筛选器来收集一定比例的日志,例如 1% 的成功 HTTP 响应。此外,请注意,每个项目每月的前 50 GiB 日志是免费的 1。日志存储桶中的前 30 天存储也是免费的。

喵喔喔

最后,正如@leo-y所建议的那样,我有点嘲笑了一个记录器,并将实现细节隐藏在接口后面。我不愿意这样做,因为我是golang的新手,但最终这不是那么多的代码:logging/Logger.go:package logging// Logger is just an interface to abstract away what// kind of logger we return on initializationtype Logger interface {    LogInfo(string)    LogWarning(string)    LogError(string)    Close()}日志记录/初始化/日志记录.package initializationimport (    "context"    "log"    customLogging "organization/module-name/logging"    "cloud.google.com/go/logging"    "google.golang.org/api/option")// GetLogger return a logging clientfunc 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() {}主要.gopackage mainimport (    "organization/module-name/logging/initialization")func main() {    logger := initialization.GetLogger(false)    defer logger.Close()    logger.LogInfo("hello")}我还没有对代码提出太多挑战,所以也许它会有一些怪癖。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go