@@ -19,14 +19,17 @@ package logger
1919import (
2020 "fmt"
2121 "runtime"
22+ "sync"
2223
2324 "go.uber.org/zap"
2425 "go.uber.org/zap/zapcore"
2526)
2627
2728var (
28- Logger * zap.Logger
29- Sugar * zap.SugaredLogger
29+ Logger * zap.Logger
30+ Sugar * zap.SugaredLogger
31+ levelMu sync.RWMutex
32+ atomicLevel zap.AtomicLevel
3033)
3134
3235// Init initializes the global logger
@@ -47,6 +50,9 @@ func Init(level string) error {
4750 zapLevel = zapcore .InfoLevel
4851 }
4952
53+ // Create atomic level for dynamic updates
54+ atomicLevel = zap .NewAtomicLevelAt (zapLevel )
55+
5056 // Custom encoder config to control output format
5157 encoderConfig := zapcore.EncoderConfig {
5258 TimeKey : "timestamp" ,
@@ -65,7 +71,7 @@ func Init(level string) error {
6571
6672 // Configure zap
6773 config := zap.Config {
68- Level : zap . NewAtomicLevelAt ( zapLevel ) ,
74+ Level : atomicLevel ,
6975 Development : false ,
7076 Encoding : "console" ,
7177 EncoderConfig : encoderConfig ,
@@ -136,3 +142,37 @@ func Warn(msg string, fields ...zap.Field) {
136142 }
137143 Logger .Warn (msg , fields ... )
138144}
145+
146+ // GetLevel returns the current log level
147+ func GetLevel () string {
148+ levelMu .RLock ()
149+ defer levelMu .RUnlock ()
150+ return atomicLevel .String ()
151+ }
152+
153+ // SetLevel sets the log level at runtime
154+ func SetLevel (level string ) error {
155+ levelMu .Lock ()
156+ defer levelMu .Unlock ()
157+
158+ var zapLevel zapcore.Level
159+ switch level {
160+ case "debug" :
161+ zapLevel = zapcore .DebugLevel
162+ case "info" :
163+ zapLevel = zapcore .InfoLevel
164+ case "warn" , "warning" :
165+ zapLevel = zapcore .WarnLevel
166+ case "error" :
167+ zapLevel = zapcore .ErrorLevel
168+ case "fatal" :
169+ zapLevel = zapcore .FatalLevel
170+ case "panic" :
171+ zapLevel = zapcore .PanicLevel
172+ default :
173+ return fmt .Errorf ("unknown log level: %s" , level )
174+ }
175+
176+ atomicLevel .SetLevel (zapLevel )
177+ return nil
178+ }
0 commit comments