gpt4 book ai didi

go - 动态更改某些代码的zap日志级别

转载 作者:行者123 更新时间:2023-12-01 22:07:19 25 4
gpt4 key购买 nike

我曾经使用过Java和log4j,在其中我可以动态更改单个类的日志级别,而无需任何额外的(编码)工作。

现在,当我使用golang(使用zap进行记录)时–我寻求相同的功能,但找不到它。

是否有一种简单的方法可以动态更改文件或包或部分代码的日志级别?

最佳答案

zap通过像NewStdLog这样的构造函数支持log.Logger包装,因此,如果您想继续使用zap,则以下技术将起作用:

如果您不想使用第三方记录器,则使用go的标准库log.Logger可以轻松实现以下技术:

定义一些默认的应用程序记录器:

var (
pkgname = "mypkgname"
Info = log.New(os.Stdout, "[INFO:"+pkgname+"] ", log.LstdFlags)
Debug = log.New(ioutil.Discard, "[DBUG:"+pkgname+"] ", log.LstdFlags|log.Lshortfile)
Trace = log.New(ioutil.Discard, "[TRCE:"+pkgname+"] ", log.LstdFlags|log.Lmicroseconds|log.Lshortfile)
)

因此,默认情况下 Info将写入 Stdout-但默认情况下 DebugTrace将为“关闭”状态。

然后,您可以在开始时安全地(即goroutine安全)打开或关闭这些 log.Loggers:
func init() {
if v, ok := os.LookupEnv("DEBUG"); ok && v != "" {
Info.Println("ENV VAR 'DEBUG' set: enabling debug-level logging")
Debug.SetOutput(os.Stderr)
}
}

或在运行时:
func httpServiceHandler(r *req) {
if r.TraceingOn {
Trace.SetOutput(os.Stderr)
} else {
Trace.SetOutput(ioutil.Discard)
}
}

以pkg级别记录就像其他任何 log方法一样:
Debug.Printf("http request: %+v", r)

如果不想生成一个昂贵的日志事件-如果说记录器设置为 discard-您可以像这样安全地检查记录器的状态:
if Trace.Writer() != ioutil.Discard {
// do expensive logging here

// e.g. bs, _ = ioutil.ReadAll(resp.Body); Trace.Println("RESP: RAW-http response:", string(bs))
}

关于go - 动态更改某些代码的zap日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com