Skip to content

Commit 61791f1

Browse files
authored
Introduce HasSelector method on local logger (#332)
* Introduce method on local logger * add test
1 parent 2a4dfe3 commit 61791f1

File tree

3 files changed

+39
-21
lines changed

3 files changed

+39
-21
lines changed

logp/core.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func init() {
5050
rootLogger: zap.NewNop(),
5151
globalLogger: zap.NewNop(),
5252
level: zap.NewAtomicLevel(),
53-
logger: newLogger(zap.NewNop(), ""),
53+
logger: newLogger(zap.NewNop(), make(map[string]struct{})),
5454
})
5555
}
5656

@@ -144,7 +144,7 @@ func ConfigureWithOutputs(defaultLoggerCfg Config, outputs ...zapcore.Core) erro
144144
selectors: selectors,
145145
rootLogger: root,
146146
globalLogger: root.WithOptions(zap.AddCallerSkip(1)),
147-
logger: newLogger(root, ""),
147+
logger: newLogger(root, selectors),
148148
level: level,
149149
observedLogs: observedLogs,
150150
})
@@ -197,7 +197,7 @@ func ConfigureWithCore(loggerCfg Config, core zapcore.Core) error {
197197
selectors: selectors,
198198
rootLogger: root,
199199
globalLogger: root.WithOptions(zap.AddCallerSkip(1)),
200-
logger: newLogger(root, ""),
200+
logger: newLogger(root, selectors),
201201
level: level,
202202
observedLogs: nil,
203203
})
@@ -247,11 +247,11 @@ func ConfigureWithCoreLocal(loggerCfg Config, core zapcore.Core) (*Logger, error
247247
selectors: selectors,
248248
rootLogger: root,
249249
globalLogger: root.WithOptions(zap.AddCallerSkip(1)),
250-
logger: newLogger(root, ""),
250+
logger: newLogger(root, selectors),
251251
level: level,
252252
observedLogs: nil,
253253
})
254-
return newLogger(root, ""), nil
254+
return newLogger(root, selectors), nil
255255
}
256256

257257
// ConfigureWithTypedOutput configures the global logger to use typed outputs.
@@ -303,7 +303,7 @@ func ConfigureWithTypedOutput(defaultLoggerCfg, typedLoggerCfg Config, key, valu
303303
selectors: selectors,
304304
rootLogger: root,
305305
globalLogger: root.WithOptions(zap.AddCallerSkip(1)),
306-
logger: newLogger(root, ""),
306+
logger: newLogger(root, selectors),
307307
level: level,
308308
observedLogs: observedLogs,
309309
})
@@ -353,11 +353,11 @@ func ConfigureWithTypedOutputLocal(defaultLoggerCfg, typedLoggerCfg Config, key,
353353
selectors: selectors,
354354
rootLogger: root,
355355
globalLogger: root.WithOptions(zap.AddCallerSkip(1)),
356-
logger: newLogger(root, ""),
356+
logger: newLogger(root, selectors),
357357
level: level,
358358
observedLogs: observedLogs,
359359
})
360-
logger := newLogger(root, "")
360+
logger := newLogger(root, selectors)
361361
return logger, nil
362362
}
363363

logp/logger.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ type LogOption = zap.Option
3232

3333
// Logger logs messages to the configured output.
3434
type Logger struct {
35-
logger *zap.Logger
36-
sugar *zap.SugaredLogger
35+
logger *zap.Logger
36+
sugar *zap.SugaredLogger
37+
selectors map[string]struct{} // Set of enabled debug selectors.
3738
}
3839

39-
func newLogger(rootLogger *zap.Logger, selector string, options ...LogOption) *Logger {
40+
func newLogger(rootLogger *zap.Logger, selector map[string]struct{}, options ...LogOption) *Logger {
4041
log := rootLogger.
4142
WithOptions(zap.AddCallerSkip(1)).
42-
WithOptions(options...).
43-
Named(selector)
44-
return &Logger{log, log.Sugar()}
43+
WithOptions(options...)
44+
45+
return &Logger{log, log.Sugar(), selector}
4546
}
4647

4748
// NewLogger returns a new Logger labeled with the name of the selector. This
@@ -50,13 +51,14 @@ func newLogger(rootLogger *zap.Logger, selector string, options ...LogOption) *L
5051
// Instead create new Logger instance that your object reuses. Or if you need to
5152
// log from a static context then you may use logp.L().Infow(), for example.
5253
func NewLogger(selector string, options ...LogOption) *Logger {
53-
return newLogger(loadLogger().rootLogger, selector, options...)
54+
logger := loadLogger().rootLogger.Named(selector)
55+
return newLogger(logger, make(map[string]struct{}), options...)
5456
}
5557

5658
// NewNopLogger returns a no-op logger
5759
func NewNopLogger() *Logger {
5860
logger := zap.NewNop()
59-
return &Logger{logger, logger.Sugar()}
61+
return &Logger{logger, logger.Sugar(), make(map[string]struct{})}
6062
}
6163

6264
// NewProductionLogger returns a production suitable logp.Logger
@@ -66,7 +68,7 @@ func NewProductionLogger(selector string, options ...LogOption) (*Logger, error)
6668
if err != nil {
6769
return nil, err
6870
}
69-
return &Logger{log, log.Sugar()}, nil
71+
return &Logger{log, log.Sugar(), make(map[string]struct{})}, nil
7072
}
7173

7274
// NewDevelopmentLogger returns a development suitable logp.Logger
@@ -83,7 +85,7 @@ func NewDevelopmentLogger(selector string, options ...LogOption) (*Logger, error
8385
if err != nil {
8486
return nil, err
8587
}
86-
return &Logger{logger, logger.Sugar()}, nil
88+
return &Logger{logger, logger.Sugar(), make(map[string]struct{})}, nil
8789
}
8890

8991
// NewInMemory returns a new in-memory logger along with the buffer to which it
@@ -144,24 +146,30 @@ func NewInMemoryLocal(selector string, encCfg zapcore.EncoderConfig) (*Logger, *
144146
return logger, &buff
145147
}
146148

149+
// HasSelector returns true if the given selector was explicitly set.
150+
func (l *Logger) HasSelector(selector string) bool {
151+
_, found := l.selectors[selector]
152+
return found
153+
}
154+
147155
// WithOptions returns a clone of l with options applied.
148156
func (l *Logger) WithOptions(options ...LogOption) *Logger {
149157
cloned := l.logger.WithOptions(options...)
150-
return &Logger{cloned, cloned.Sugar()}
158+
return &Logger{cloned, cloned.Sugar(), l.selectors}
151159
}
152160

153161
// With creates a child logger and adds structured context to it. Fields added
154162
// to the child don't affect the parent, and vice versa.
155163
func (l *Logger) With(args ...interface{}) *Logger {
156164
sugar := l.sugar.With(args...)
157-
return &Logger{sugar.Desugar(), sugar}
165+
return &Logger{sugar.Desugar(), sugar, l.selectors}
158166
}
159167

160168
// Named adds a new path segment to the logger's name. Segments are joined by
161169
// periods.
162170
func (l *Logger) Named(name string) *Logger {
163171
logger := l.logger.Named(name)
164-
return &Logger{logger, logger.Sugar()}
172+
return &Logger{logger, logger.Sugar(), l.selectors}
165173
}
166174

167175
// Sprint

logp/logger_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,13 @@ func TestNewInMemory(t *testing.T) {
7979
assert.Contains(t, logs[3], "error_key")
8080
assert.Contains(t, logs[3], "error_val")
8181
}
82+
83+
func TestLoggerHasSelector(t *testing.T) {
84+
logger := newLogger(zap.NewNop(), map[string]struct{}{
85+
"config": {},
86+
"*": {},
87+
})
88+
89+
assert.True(t, logger.HasSelector("config"))
90+
assert.False(t, logger.HasSelector("publish"))
91+
}

0 commit comments

Comments
 (0)