[英]How to dynamically change log level in uber/zap logger
我的项目结构如下:
在我的记录器 package 中,我遵循代码的和平,它只是创建了一个记录器并替换了 zap 的全局记录器
var logger *zap.Logger
var atomicLevel zap.AtomicLevel
func init() {
lmb := config.NewLumberjack()
atomicLevel = newAtomicLevel()
logger = newLogger(lmb, atomicLevel)
zap.ReplaceGlobals(logger)
setRotation(lmb)
onLogLevelChange()
}
func SetLevel(l string) {
atomicLevel.SetLevel(config.ParseLevel(l))
}
在我的app package
的主要代码库中,我有时应该更改日志记录级别,我这样做是这样的
logger.SetLevel("debug")
zap.L().Debug("Message", zap.Duration("exec_time", time.Second))
The problem is I don't want to call function from another package to change the behavior of an object which is located completely in different package. 有没有其他更好的方法来解决这个问题?
我认为在这种情况下,当您不想从另一个 package 切换记录器本身或用高级设置器包装它时,您可以集中切换日志记录级别:
1)为记录器注册ServeHTTP,您应该在其中传递记录器的AtomicLevel。 这部分文档将在这种情况下有所帮助。 此链接也可能会有所帮助。 在这里,您可以使用 PUT http 请求切换您的记录器级别。
2) 与第 1) 点方法相同,但使用系统信号(例如 USR2)切换电平。 您需要在无限循环 select 中放置等待信号(SIGKILL、SIGTERM 和 USR2)的代码,如下所示:
for {
select {
case usrSig := <-WaitForOsUser2Signal():
// here you can switch your global logger level with atomicLevel
atomicLevel.SetLevel(zap.ErrorLevel)
case sig := <-WaitForOsStopProcessSignals():
// here you should handle graceful shutdown of your app
return
}
}
并从 select 块实现功能:
func WaitForOsStopProcessSignals() <-chan os.Signal {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
return sigCh
}
func WaitForOsUser2Signal() <-chan os.Signal {
usr2Ch := make(chan os.Signal, 1)
signal.Notify(usr2Ch, syscall.SIGUSR2)
return usr2Ch
}
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.