in logp/core.go [83:132]
func createSink(defaultLoggerCfg Config, outputs ...zapcore.Core) (zapcore.Core, zap.AtomicLevel, *observer.ObservedLogs, map[string]struct{}, error) {
var (
sink zapcore.Core
observedLogs *observer.ObservedLogs
err error
level zap.AtomicLevel
)
level = zap.NewAtomicLevelAt(defaultLoggerCfg.Level.ZapLevel())
// Build a single output (stderr has priority if more than one are enabled).
if defaultLoggerCfg.toObserver {
sink, observedLogs = observer.New(level)
} else {
sink, err = createLogOutput(defaultLoggerCfg, level)
}
if err != nil {
return nil, level, nil, nil, fmt.Errorf("failed to build log output: %w", err)
}
// Default logger is always discard, debug level below will
// possibly re-enable it.
golog.SetOutput(io.Discard)
// Enabled selectors when debug is enabled.
selectors := make(map[string]struct{}, len(defaultLoggerCfg.Selectors))
if defaultLoggerCfg.Level.Enabled(DebugLevel) && len(defaultLoggerCfg.Selectors) > 0 {
for _, sel := range defaultLoggerCfg.Selectors {
selectors[strings.TrimSpace(sel)] = struct{}{}
}
// Default to all enabled if no selectors are specified.
if len(selectors) == 0 {
selectors["*"] = struct{}{}
}
// Re-enable the default go logger output when either stdlog
// or all selector is enabled.
_, stdlogEnabled := selectors["stdlog"]
_, allEnabled := selectors["*"]
if stdlogEnabled || allEnabled {
golog.SetOutput(_defaultGoLog)
}
sink = selectiveWrapper(sink, selectors)
}
sink = newMultiCore(append(outputs, sink)...)
return sink, level, observedLogs, selectors, err
}