我的项目结构如下:
在我的记录器程序包中,我遵循以下代码的平静规定,即仅创建一个记录器并替换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))
问题是我不想从另一个包中调用函数来更改完全位于不同包中的对象的行为。 还有其他更好的方法来解决这个问题吗?
答案 0 :(得分:0)
我认为,在这种情况下,当您不想从另一个软件包切换记录器本身或使用高级设置程序包装它时,可以对日志记录级别进行集中切换:
1)注册用于记录器的ServeHTTP,您应该在其中传递记录器的AtomicLevel。在这种情况下,这份part文档会有所帮助。此外,this链接也可能会有所帮助。在这里,您可以使用PUT http请求切换记录器级别。
2)进行与点1)相同的方法,但开关电平随系统信号而变化(例如USR2)。您需要将代码放置在一个无限循环中,等待信号(SIGKILL,SIGTERM和USR2),如下所示:
body {
background-color: #444;
margin: 0;}
#wrapper {
display: flex;
flex-direction: column;
min-height: 100vh;
}
#header {
background-color: darkgray;
/* height: 64px; */
position: sticky;
top: 0;
}
以及选择块中功能的实现:
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
}
}
希望这会有所帮助。