@@ -109,25 +109,35 @@ func New(w io.Writer, opts *Options) *Logger {
109109// Clone returns a new logger with the same configuration
110110// as the original logger.
111111func (l * Logger ) Clone () * Logger {
112+ if l == nil {
113+ return l
114+ }
112115 newL := * l
113116 return & newL
114117}
115118
116119// Level returns the current log level of the logger.
117120func (l * Logger ) Level () Level {
121+ if l == nil {
122+ return LevelFatal + 1
123+ }
124+
118125 return Level (l .lvl .Level ())
119126}
120127
121128// SetLevel changes the log level of the logger
122129// and all loggers cloned from it.
123130func (l * Logger ) SetLevel (lvl Level ) {
131+ if l == nil {
132+ return
133+ }
124134 l .lvl .Set (lvl .Level ())
125135}
126136
127137// WithLevel returns a copy of this logger
128138// that will log at the given level.
129139func (l * Logger ) WithLevel (lvl Level ) * Logger {
130- if lvl == l .Level () {
140+ if l == nil || lvl == l .Level () {
131141 return l
132142 }
133143
@@ -140,6 +150,9 @@ func (l *Logger) WithLevel(lvl Level) *Logger {
140150
141151// WithGroup returns a copy of the logger with the given group name added.
142152func (l * Logger ) WithGroup (name string ) * Logger {
153+ if l == nil || name == "" {
154+ return l
155+ }
143156 newL := l .Clone ()
144157 newL .sl = newL .sl .WithGroup (name )
145158 return newL
@@ -151,6 +164,9 @@ func (l *Logger) WithGroup(name string) *Logger {
151164// If the prefix is empty, an existing prefix will be removed.
152165// If the prefix is non-empty, a ": " delimiter will be added.
153166func (l * Logger ) WithPrefix (prefix string ) * Logger {
167+ if l == nil {
168+ return l
169+ }
154170 newL := l .Clone ()
155171 newL .sl = slog .New (newL .sl .Handler ().(* logHandler ).WithPrefix (prefix ))
156172 return newL
@@ -164,14 +180,17 @@ func (l *Logger) WithPrefix(prefix string) *Logger {
164180// will be downgraded to LevelDebug,
165181// Levels at the minimum level will be discarded.
166182func (l * Logger ) Downgrade () * Logger {
183+ if l == nil {
184+ return l
185+ }
167186 newL := l .Clone ()
168187 newL .numDowngrades ++
169188 return newL
170189}
171190
172191// With returns a copy of the logger with the given attributes added.
173192func (l * Logger ) With (attrs ... any ) * Logger {
174- if len (attrs ) == 0 {
193+ if l == nil || len (attrs ) == 0 {
175194 return l
176195 }
177196
@@ -182,6 +201,13 @@ func (l *Logger) With(attrs ...any) *Logger {
182201
183202// Log logs a message at the given level with the given key-value pairs.
184203func (l * Logger ) Log (lvl Level , msg string , kvs ... any ) {
204+ if l == nil {
205+ if lvl >= LevelFatal {
206+ _osExit (1 ) // exit on fatal regardless
207+ }
208+ return
209+ }
210+
185211 if l .numDowngrades > 0 {
186212 lvl = lvl .Dec (l .numDowngrades )
187213 }
@@ -229,4 +255,6 @@ func (l *Logger) Errorf(format string, args ...any) { l.Logf(LevelError, format,
229255// It also exits the program with a non-zero status code.
230256func (l * Logger ) Fatalf (format string , args ... any ) { l .Logf (LevelFatal , format , args ... ) }
231257
232- func exitOnFatal () { os .Exit (1 ) }
258+ var _osExit = os .Exit // for testing
259+
260+ func exitOnFatal () { _osExit (1 ) }
0 commit comments