@@ -27,7 +27,12 @@ const (
2727 TermColorSink = "term-color"
2828)
2929
30- func init () {
30+ func init () { //nolint:gochecknoinits
31+ resetBuiltInSinks ()
32+ }
33+
34+ func resetBuiltInSinks () {
35+ sinkConstructors = sync.Map {}
3136 RegisterSinkConstructor (TextSink , textSinkConstructor )
3237 // for v1 compatibility, "console" is an alias for "text"
3338 RegisterSinkConstructor (ConsoleSink , textSinkConstructor )
@@ -37,6 +42,12 @@ func init() {
3742}
3843
3944func RegisterSinkConstructor (name string , constructor SinkConstructor ) {
45+ if constructor == nil {
46+ panic (fmt .Sprintf ("constructor for sink %q is nil" , name ))
47+ }
48+ if name == "" {
49+ panic ("constructor registered with empty name" )
50+ }
4051 sinkConstructors .Store (name , constructor )
4152}
4253
@@ -144,16 +155,9 @@ type Config struct {
144155 ReplaceAttrs []func ([]string , slog.Attr ) slog.Attr
145156}
146157
147- const (
148- EncodingJSON = "json"
149- EncodingText = "text"
150- EncodingTerm = "term"
151- EncodingTermColor = "term-color"
152- )
153-
154158func DevDefaults () Config {
155159 return Config {
156- DefaultSink : "term-color" ,
160+ DefaultSink : TermColorSink ,
157161 AddSource : true ,
158162 }
159163}
@@ -181,9 +185,10 @@ func parseLevel(v any) (slog.Level, error) {
181185 case string :
182186 s = v
183187 case float64 :
184- // allow raw integer values for level
188+ // allow numbers to be used as level values
185189 return slog .Level (v ), nil
186190 case int :
191+ // allow raw integer values for level
187192 return slog .Level (v ), nil
188193 case bool :
189194 if v {
@@ -290,7 +295,7 @@ func (c *Config) UnmarshalJSON(bytes []byte) error {
290295 }
291296 }
292297 default :
293- return merry .Errorf ("invalid level value: %v" , s .Levels )
298+ return merry .Errorf ("invalid levels value: %v" , s .Levels )
294299 }
295300
296301 // for backward compat with v1, allow "addCaller" as
@@ -339,16 +344,27 @@ func (c Config) Handler() (slog.Handler, error) {
339344 if ! ok {
340345 return nil , errors .New ("unknown sink constructor: " + c .DefaultSink )
341346 }
342- constructor := v .(SinkConstructor )
347+ constructor , _ := v .(SinkConstructor )
343348 return constructor (c )
344349}
345350
351+ // Controller returns a new controller configured with the given config.
352+ func (c Config ) Controller () (* Controller , error ) {
353+ ctl := NewController (nil )
354+ err := c .Configure (ctl )
355+ if err != nil {
356+ return nil , err
357+ }
358+ return ctl , nil
359+ }
360+
361+ // Configure configures a controller with the given config.
362+ //
363+ // It sets the default level, levels, and sink. Level settings
364+ // replace any current level settings.
346365func (c Config ) Configure (ctl * Controller ) error {
347366 ctl .SetDefaultLevel (c .DefaultLevel )
348-
349- for name , level := range c .Levels {
350- ctl .SetLevel (name , level )
351- }
367+ ctl .SetLevels (c .Levels , true )
352368
353369 h , err := c .Handler ()
354370 if err != nil {
0 commit comments