Source file src/log/slog/example_level_handler_test.go

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package slog_test
     6  
     7  import (
     8  	"context"
     9  	"log/slog"
    10  	"log/slog/internal/slogtest"
    11  	"os"
    12  )
    13  
    14  // A LevelHandler wraps a Handler with an Enabled method
    15  // that returns false for levels below a minimum.
    16  type LevelHandler struct {
    17  	level   slog.Leveler
    18  	handler slog.Handler
    19  }
    20  
    21  // NewLevelHandler returns a LevelHandler with the given level.
    22  // All methods except Enabled delegate to h.
    23  func NewLevelHandler(level slog.Leveler, h slog.Handler) *LevelHandler {
    24  	// Optimization: avoid chains of LevelHandlers.
    25  	if lh, ok := h.(*LevelHandler); ok {
    26  		h = lh.Handler()
    27  	}
    28  	return &LevelHandler{level, h}
    29  }
    30  
    31  // Enabled implements Handler.Enabled by reporting whether
    32  // level is at least as large as h's level.
    33  func (h *LevelHandler) Enabled(_ context.Context, level slog.Level) bool {
    34  	return level >= h.level.Level()
    35  }
    36  
    37  // Handle implements Handler.Handle.
    38  func (h *LevelHandler) Handle(ctx context.Context, r slog.Record) error {
    39  	return h.handler.Handle(ctx, r)
    40  }
    41  
    42  // WithAttrs implements Handler.WithAttrs.
    43  func (h *LevelHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
    44  	return NewLevelHandler(h.level, h.handler.WithAttrs(attrs))
    45  }
    46  
    47  // WithGroup implements Handler.WithGroup.
    48  func (h *LevelHandler) WithGroup(name string) slog.Handler {
    49  	return NewLevelHandler(h.level, h.handler.WithGroup(name))
    50  }
    51  
    52  // Handler returns the Handler wrapped by h.
    53  func (h *LevelHandler) Handler() slog.Handler {
    54  	return h.handler
    55  }
    56  
    57  // This example shows how to Use a LevelHandler to change the level of an
    58  // existing Handler while preserving its other behavior.
    59  //
    60  // This example demonstrates increasing the log level to reduce a logger's
    61  // output.
    62  //
    63  // Another typical use would be to decrease the log level (to LevelDebug, say)
    64  // during a part of the program that was suspected of containing a bug.
    65  func ExampleHandler_levelHandler() {
    66  	th := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: slogtest.RemoveTime})
    67  	logger := slog.New(NewLevelHandler(slog.LevelWarn, th))
    68  	logger.Info("not printed")
    69  	logger.Warn("printed")
    70  
    71  	// Output:
    72  	// level=WARN msg=printed
    73  }
    74  

View as plain text