在开发/测试环境中使用cloud.google.com/go/logging时,是否有方法禁用日志转发到GCP ?<



我考虑过"隐藏"在开发环境中运行代码时,从它返回一个正常的日志记录器(log),在GCP上部署代码时返回一个cloud.google.com/go/logging日志记录器。

但是cloud.google.com/go/logging记录器没有与log相同的接口,所以它需要一些额外的包装,我希望我能避免这种情况。

查看文档,我找不到这样做的标准方法。如果没有办法做到这一点,常见的方法是什么,以避免垃圾邮件谷歌云日志与日志不是来自预生产/生产环境?除了使日志产生噪音之外,在某些情况下,日志的摄取有一个我希望避免的成本。

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

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

注:我建议您在https://github.com/googleapis/google-cloud-go中打开一个问题,并要求进行更改。虽然这可能会导致突破性的变化,但提供反馈仍然很重要。

重述评论:
Google Cloud允许为sink创建排除过滤器。根据Google docs:

您可以选择将日志导出到BigQuery, Cloud Storage或Cloud Pub/Sub,而无需付费来摄取它们Stackdriver。您甚至可以使用排除过滤器来收集一定百分比的日志,例如1%的成功HTTP响应。

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

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

日志/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()
}

日志/初始化/logging.go

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: %sn", s)
}
func (logger loggerConsole) LogWarning(s string) {
log.Printf("WARNING: %sn", s)
}
func (logger loggerConsole) LogError(s string) {
log.Printf("ERROR: %sn", s)
}
func (logger loggerConsole) Close() {
}

main.go

package main
import (
"organization/module-name/logging/initialization"
)
func main() {
logger := initialization.GetLogger(false)
defer logger.Close()
logger.LogInfo("hello")
}

我还没有对这段代码进行太多挑战,所以它可能会有一些怪癖