Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何在uber/zap记录器中动态更改日志级别_Go_Uber Api - Fatal编程技术网

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

我的项目结构如下:

  • 指令
  • 应用程序
  • 包装
    • 记录器
    • 配置
在我的记录器软件包中,我有下面的代码和平,它只是创建了一个记录器并取代了zap的全局记录器

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
}