11package flagsmith
22
33import (
4- "log"
4+ "context"
5+ "fmt"
6+ "log/slog"
57 "os"
8+ "strings"
69)
710
811// Logger is the interface used for logging by flagsmith client. This interface defines the methods
@@ -19,33 +22,99 @@ type Logger interface {
1922 Debugf (format string , v ... interface {})
2023}
2124
22- func createLogger () * logger {
23- l := & logger {l : log .New (os .Stderr , "" , log .Ldate | log .Lmicroseconds )}
24- return l
25+ // slogToRestyAdapter adapts a slog.Logger to resty.Logger
26+ type slogToRestyAdapter struct {
27+ logger * slog.Logger
28+ }
29+
30+ func newSlogToRestyAdapter (logger * slog.Logger ) * slogToRestyAdapter {
31+ return & slogToRestyAdapter {logger : logger }
32+ }
33+
34+ func (l * slogToRestyAdapter ) Errorf (format string , v ... interface {}) {
35+ l .logger .Error (format , v ... )
36+ }
37+
38+ func (l * slogToRestyAdapter ) Warnf (format string , v ... interface {}) {
39+ l .logger .Warn (format , v ... )
40+ }
41+
42+ func (l * slogToRestyAdapter ) Debugf (format string , v ... interface {}) {
43+ l .logger .Debug (format , v ... )
44+ }
45+
46+ // slogToLoggerAdapter adapts a slog.Logger to our Logger interface
47+ type slogToLoggerAdapter struct {
48+ logger * slog.Logger
49+ }
50+
51+ func newSlogToLoggerAdapter (logger * slog.Logger ) * slogToLoggerAdapter {
52+ return & slogToLoggerAdapter {logger : logger }
2553}
2654
27- var _ Logger = (* logger )(nil )
55+ func (l * slogToLoggerAdapter ) Errorf (format string , v ... interface {}) {
56+ l .logger .Error (fmt .Sprintf (format , v ... ))
57+ }
58+
59+ func (l * slogToLoggerAdapter ) Warnf (format string , v ... interface {}) {
60+ l .logger .Warn (fmt .Sprintf (format , v ... ))
61+ }
2862
29- type logger struct {
30- l * log. Logger
63+ func ( l * slogToLoggerAdapter ) Debugf ( format string , v ... interface {}) {
64+ l . logger . Debug ( fmt . Sprintf ( format , v ... ))
3165}
3266
33- func (l * logger ) Errorf (format string , v ... interface {}) {
34- l .output ("ERROR FLAGSMITH: " + format , v ... )
67+ // loggerToSlogAdapter adapts our Logger interface to a slog.Logger
68+ type loggerToSlogAdapter struct {
69+ logger Logger
3570}
3671
37- func (l * logger ) Warnf (format string , v ... interface {}) {
38- l .output ("WARN FLAGSMITH: " + format , v ... )
72+ func newLoggerToSlogAdapter (logger Logger ) * slog.Logger {
73+ return slog .New (slog .NewTextHandler (os .Stderr , & slog.HandlerOptions {
74+ Level : slog .LevelDebug ,
75+ ReplaceAttr : func (groups []string , a slog.Attr ) slog.Attr {
76+ // We don't need to modify any attributes since we're using the existing logger
77+ return a
78+ },
79+ }))
3980}
4081
41- func (l * logger ) Debugf (format string , v ... interface {}) {
42- l .output ("DEBUG FLAGSMITH: " + format , v ... )
82+ // implement slog.Handler interface to adapt our Logger interface to a slog.Logger
83+
84+ func (l * loggerToSlogAdapter ) Enabled (ctx context.Context , level slog.Level ) bool {
85+ return true
4386}
4487
45- func (l * logger ) output (format string , v ... interface {}) {
46- if len (v ) == 0 {
47- l .l .Print (format )
48- return
88+ func (l * loggerToSlogAdapter ) Handle (ctx context.Context , r slog.Record ) error {
89+ msg := r .Message
90+ var attrs strings.Builder
91+ r .Attrs (func (a slog.Attr ) bool {
92+ attrs .WriteString (a .String () + " " )
93+ return true
94+ })
95+ msg += attrs .String ()
96+
97+ switch r .Level {
98+ case slog .LevelError :
99+ l .logger .Errorf (msg )
100+ case slog .LevelWarn :
101+ l .logger .Warnf (msg )
102+ case slog .LevelDebug :
103+ l .logger .Debugf (msg )
49104 }
50- l .l .Printf (format , v ... )
105+ return nil
106+ }
107+
108+ func (l * loggerToSlogAdapter ) WithAttrs (_ []slog.Attr ) slog.Handler {
109+ return l
110+ }
111+
112+ func (l * loggerToSlogAdapter ) WithGroup (_ string ) slog.Handler {
113+ return l
114+ }
115+
116+ func createLogger () * slog.Logger {
117+ return slog .New (slog .NewTextHandler (os .Stderr , & slog.HandlerOptions {
118+ Level : slog .LevelDebug ,
119+ }))
51120}
0 commit comments