gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:27:59 27 4
gpt4 key购买 nike

我的项目结构如下:

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

  • 在我的记录程序包中,我遵循以下代码的平静规定,即仅创建一个记录程序并替换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))

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

    最佳答案

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

    1)注册用于记录器的ServeHTTP,您应该在其中传递记录器的AtomicLevel。在这种情况下,文档的part会有所帮助。 this链接也可能会有所帮助。在这里,您可以使用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
    }
    }

    并从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
    }

    希望这会有所帮助。

    关于go - 如何在uber/zap记录器中动态更改日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58664093/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com