github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/internal/log/slog_handler.go (about)

     1  package log
     2  
     3  import (
     4  	"context"
     5  	"github.com/lmittmann/tint"
     6  	"log/slog"
     7  
     8  	"os"
     9  )
    10  
    11  type ContextHandler struct {
    12  	handler      slog.Handler
    13  	errorHandler slog.Handler
    14  	outStream    *os.File
    15  	errStream    *os.File
    16  	options      *tint.Options
    17  }
    18  
    19  func NewContextHandler(h slog.Handler, out *os.File, err *os.File, opts *tint.Options) *ContextHandler {
    20  	ch := &ContextHandler{outStream: out, errStream: err, options: opts}
    21  	if lh, ok := h.(*ContextHandler); ok {
    22  		if lh.outStream == out && lh.errStream == err {
    23  			return lh
    24  		}
    25  	}
    26  
    27  	errOpts := *opts
    28  	errOpts.Level = slog.LevelWarn
    29  	// create a error logger
    30  	// set global logger with custom options
    31  	errorHandler := tint.NewHandler(err, &errOpts)
    32  	ch.errorHandler = errorHandler
    33  
    34  	outHandler := tint.NewHandler(out, opts)
    35  	ch.handler = outHandler
    36  	return ch
    37  }
    38  
    39  func (h *ContextHandler) Enabled(ctx context.Context, level slog.Level) bool {
    40  	if level >= slog.LevelWarn {
    41  		return h.errorHandler.Enabled(ctx, level)
    42  	}
    43  
    44  	return h.handler.Enabled(ctx, level)
    45  }
    46  
    47  func (h *ContextHandler) Handle(ctx context.Context, r slog.Record) error {
    48  
    49  	if r.Level >= slog.LevelWarn {
    50  		return h.errorHandler.Handle(ctx, r)
    51  	}
    52  	return h.handler.Handle(ctx, r)
    53  }
    54  
    55  func (h *ContextHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
    56  	return NewContextHandler(h.handler.WithAttrs(attrs), h.outStream, h.errStream, nil)
    57  }
    58  
    59  func (h *ContextHandler) WithGroup(name string) slog.Handler {
    60  	return NewContextHandler(h.handler.WithGroup(name), h.outStream, h.errStream, nil)
    61  }