为了账号安全,请及时绑定邮箱和手机立即绑定

如何动态更改 uber/zap 记录器中的日志级别

如何动态更改 uber/zap 记录器中的日志级别

Go
POPMUISE 2023-07-31 16:42:54
我的项目结构如下:指令应用程序包装记录器配置在我的记录器包中,我有以下代码,它只是创建一个记录器并替换 zap 的全局记录器var logger *zap.Loggervar atomicLevel zap.AtomicLevelfunc 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))问题是我不想从另一个包调用函数来更改完全位于不同包中的对象的行为。对于这个问题还有其他更好的方法吗?
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我认为在这种情况下,当您不想从另一个包切换记录器本身或用高级设置器包装它时,您可以对日志记录级别进行集中切换:

1) 为记录器注册 ServeHTTP,您应该在其中传递记录器的 AtomicLevel。

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

    }

}

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

}

希望这会有所帮助。


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信