func createSink()

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
}