@@ -25,6 +25,7 @@ func (n nopSyncer) Sync() error {
2525var (
2626 sugarLogger * zap.SugaredLogger
2727 baseLogger * zap.Logger
28+ atomicLevel zap.AtomicLevel // This allows dynamic level changes
2829 once sync.Once
2930)
3031
@@ -49,15 +50,18 @@ func initLoggerWithLevel(level string) {
4950 zapLevel = zapcore .InfoLevel // Default to info
5051 }
5152
53+ // Create atomic level for dynamic changes
54+ atomicLevel = zap .NewAtomicLevelAt (zapLevel )
55+
5256 cfg := zap .NewDevelopmentConfig ()
53- cfg .Level = zap . NewAtomicLevelAt ( zapLevel )
57+ cfg .Level = atomicLevel
5458 cfg .EncoderConfig .EncodeLevel = zapcore .CapitalColorLevelEncoder
5559 cfg .EncoderConfig .EncodeTime = zapcore .ISO8601TimeEncoder
5660 cfg .EncoderConfig .EncodeCaller = zapcore .ShortCallerEncoder
5761
5862 encoder := zapcore .NewConsoleEncoder (cfg .EncoderConfig )
5963 writer := nopSyncer {os .Stderr }
60- core := zapcore .NewCore (encoder , writer , cfg . Level )
64+ core := zapcore .NewCore (encoder , writer , atomicLevel )
6165
6266 opts := []zap.Option {
6367 zap .AddCaller (),
@@ -95,6 +99,11 @@ func InitWithLevel(level string) (*zap.SugaredLogger, func()) {
9599 initLoggerWithLevel (level )
96100 })
97101
102+ // If logger already exists, just change the level dynamically
103+ if atomicLevel .Enabled (zapcore .InfoLevel ) { // Check if atomicLevel is initialized
104+ SetLogLevel (level )
105+ }
106+
98107 if baseLogger == nil {
99108 panic ("logger initialization failed: baseLogger is nil" )
100109 }
@@ -119,13 +128,25 @@ func With(args ...interface{}) *zap.SugaredLogger {
119128 return Logger ().With (args ... )
120129}
121130
122- // SetLogLevel dynamically changes the log level
131+ // SetLogLevel dynamically changes the log level without re-initializing the logger
123132func SetLogLevel (level string ) {
124- if baseLogger != nil {
125- // For now, we'll just log a message about the level change
126- // Note: Dynamic level changing requires reconfiguring the logger core
127- // which is more complex than this simple implementation
128- sugarLogger .Infof ("Log level change requested to: %s" , level )
129- sugarLogger .Infof ("Note: Restart application to apply new log level" )
133+ if atomicLevel == (zap.AtomicLevel {}) {
134+ return // Not initialized yet
135+ }
136+
137+ var zapLevel zapcore.Level
138+ switch strings .ToLower (level ) {
139+ case "debug" :
140+ zapLevel = zapcore .DebugLevel
141+ case "info" :
142+ zapLevel = zapcore .InfoLevel
143+ case "warn" , "warning" :
144+ zapLevel = zapcore .WarnLevel
145+ case "error" :
146+ zapLevel = zapcore .ErrorLevel
147+ default :
148+ zapLevel = zapcore .InfoLevel
130149 }
150+
151+ atomicLevel .SetLevel (zapLevel )
131152}
0 commit comments