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

我的项目结构如下:

  • 指令

  • 应用程序

  • 包装

    • 记录器

    • 配置

在我的记录器包中,我有以下代码,它只是创建一个记录器并替换 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))

问题是我不想从另一个包调用函数来更改完全位于不同包中的对象的行为。对于这个问题还有其他更好的方法吗?


POPMUISE
浏览 169回答 1
1回答

红糖糍粑

我认为在这种情况下,当您不想从另一个包切换记录器本身或用高级设置器包装它时,您可以对日志记录级别进行集中切换: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}希望这会有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go