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 }