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

标签 go uber-api

我的项目结构如下:

  • 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/

    相关文章:

    go - 检查网络连接

    android - 无法在服务器端使用 Uber 刷新 token 重新生成 Uber 访问 token

    php - 无法使用有效访问 key 从 Uber API 获取 token

    unit-testing - 我如何对这个用 golang 编写的 promptui 包进行单元测试?

    go - 在Golang中计划Google Cloud Functions?

    go - 首先等待 time.AfterFunc 然后启动 time.NewTicker

    go - Slack 发送带有附件的通知

    安卓 h3 : A Hexagonal Hierarchical Geospatial Indexing System

    php - 如何使用 OAuth 刷新 token 更新访问 token ?