亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何動態更改 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 關注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號