Go 如何在uber/zap记录器中动态更改日志级别
我的项目结构如下:Go 如何在uber/zap记录器中动态更改日志级别,go,uber-api,Go,Uber Api,我的项目结构如下: 指令 应用程序 包装 记录器 配置 在我的记录器软件包中,我有下面的代码和平,它只是创建了一个记录器并取代了zap的全局记录器 var记录器*zap.logger var原子级zap.atomicLevel func init(){ lmb:=config.NewLumberjack() atomicLevel=newAtomicLevel() 记录器=新记录器(lmb,原子级) zap.ReplaceGlobals(记录器) 设置旋转(lmb) onLogLevel
- 指令
- 应用程序
- 包装
- 记录器
- 配置
var记录器*zap.logger
var原子级zap.atomicLevel
func init(){
lmb:=config.NewLumberjack()
atomicLevel=newAtomicLevel()
记录器=新记录器(lmb,原子级)
zap.ReplaceGlobals(记录器)
设置旋转(lmb)
onLogLevelChange()
}
func SetLevel(l字符串){
atomicLevel.SetLevel(config.ParseLevel(l))
}
在我的应用程序包的主代码库中,业务逻辑所在的位置,我有时应该更改日志记录级别,我就是这样做的
logger.SetLevel(“调试”)
zap.L().Debug(“Message”,zap.Duration(“exec_time”,time.Second))
问题是,我不想从另一个包调用函数来更改完全位于不同包中的对象的行为。
有其他更好的方法解决这个问题吗?我认为,在这种情况下,当您不想从另一个包中切换记录器本身或用高级setter包装它时,您可以集中切换日志级别:
1) 为logger注册ServeHTTP,在这里您应该通过logger的原子级别。在这种情况下,这部分文档将有所帮助。链接也会有帮助。在这里,您可以使用PUT http请求切换记录器级别
2) 与第1)点方法相同,但使用系统信号切换电平(例如USR2)。您需要将等待信号(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
}
}
用于{
挑选{
案例usrSig:=
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
}