繁体   English   中英

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

[英]How to dynamically change log level in uber/zap logger

我的项目结构如下:

  • cmd
  • 应用程序
    • 记录器
    • 配置

在我的记录器 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM