Skip to content

Commit dc1fe80

Browse files
committed
Correctly handle log selectors when using TypedCore
1 parent 6a5335a commit dc1fe80

2 files changed

Lines changed: 74 additions & 1 deletion

File tree

logp/core.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,21 @@ func ConfigureWithOutputs(defaultLoggerCfg Config, outputs ...zapcore.Core) erro
153153
// - `value` is the value compared against the `logKey` entry
154154
// - `outputs` is a list of cores that will be added together with the core
155155
// generated by `defaultLoggerCfg` as the default output for the loggger.
156+
//
157+
// If `defaultLoggerCfg.toObserver` is true, then `typedLoggerCfg` is ignored
158+
// and a single sink is used so all logs can be observed.
156159
func ConfigureWithTypedOutput(defaultLoggerCfg, typedLoggerCfg Config, key, value string, outputs ...zapcore.Core) error {
157160
sink, level, observedLogs, selectors, err := createSink(defaultLoggerCfg, outputs...)
158161
if err != nil {
159162
return err
160163
}
161164

162-
typedCore, err := createLogOutput(typedLoggerCfg, level)
165+
var typedCore zapcore.Core
166+
if defaultLoggerCfg.toObserver {
167+
typedCore = sink
168+
} else {
169+
typedCore, err = createLogOutput(typedLoggerCfg, level)
170+
}
163171
if err != nil {
164172
return fmt.Errorf("could not create typed logger output: %w", err)
165173
}
@@ -171,6 +179,8 @@ func ConfigureWithTypedOutput(defaultLoggerCfg, typedLoggerCfg Config, key, valu
171179
value: value,
172180
}
173181

182+
sink = selectiveWrapper(sink, selectors)
183+
174184
root := zap.New(sink, makeOptions(defaultLoggerCfg)...)
175185
storeLogger(&coreLogger{
176186
selectors: selectors,

logp/selective_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,66 @@ func TestLoggerSelectors(t *testing.T) {
5454
logs = ObserverLogs().TakeAll()
5555
assert.Len(t, logs, 1)
5656
}
57+
58+
func TestTypedCoreSelectors(t *testing.T) {
59+
logSelector := "enabled-log-selector"
60+
expectedMsg := "this should be logged"
61+
62+
defaultCfg := DefaultConfig(DefaultEnvironment)
63+
eventsCfg := DefaultEventConfig(DefaultEnvironment)
64+
65+
defaultCfg.Level = DebugLevel
66+
defaultCfg.toObserver = true
67+
defaultCfg.ToStderr = false
68+
defaultCfg.ToFiles = false
69+
defaultCfg.Selectors = []string{logSelector}
70+
71+
eventsCfg.Level = defaultCfg.Level
72+
eventsCfg.toObserver = defaultCfg.toObserver
73+
eventsCfg.ToStderr = defaultCfg.ToStderr
74+
eventsCfg.ToFiles = defaultCfg.ToFiles
75+
eventsCfg.Selectors = defaultCfg.Selectors
76+
77+
ConfigureWithTypedOutput(defaultCfg, eventsCfg, "log.type", "event")
78+
79+
enabledSelector := NewLogger(logSelector)
80+
disabledSelector := NewLogger("foo-selector")
81+
82+
enabledSelector.Debugw(expectedMsg)
83+
enabledSelector.Debugw(expectedMsg, "log.type", "event")
84+
disabledSelector.Debug("this should not be logged")
85+
86+
logEntries := ObserverLogs().TakeAll()
87+
if len(logEntries) != 2 {
88+
t.Errorf("expecting 2 log entries, got %d", len(logEntries))
89+
t.Log("Log entries:")
90+
for _, e := range logEntries {
91+
t.Log("Message:", e.Message, "Fields:", e.Context)
92+
}
93+
t.FailNow()
94+
}
95+
96+
for i, logEntry := range logEntries {
97+
msg := logEntry.Message
98+
if msg != expectedMsg {
99+
t.Fatalf("[%d] expecting log message '%s', got '%s'", i, expectedMsg, msg)
100+
}
101+
102+
// The second entry should also contain `log.type: event`
103+
if i == 1 {
104+
fields := logEntry.Context
105+
if len(fields) != 1 {
106+
t.Errorf("expecting one field, got %d", len(fields))
107+
}
108+
109+
k := fields[0].Key
110+
v := fields[0].String
111+
if k != "log.type" {
112+
t.Errorf("expecting key 'log.type', got '%s'", k)
113+
}
114+
if v != "event" {
115+
t.Errorf("expecting value 'event', got '%s'", v)
116+
}
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)