@ -23,42 +23,76 @@ func LogFieldsToSlogAttrs(in watermill.LogFields) []slog.Attr {
}
type WrappedSlogger struct {
* slog . Logger
loggers [ ] * slog . Logger
}
func NewWrappedSlogger ( w io . Writer , verbose int ) * WrappedSlogger {
opts := & slog . HandlerOptions {
Level : slog . Level ( verbose ) ,
type LogConfig struct {
Format string
Writer io . Writer
Level int
}
func NewWrappedSlogger ( configs ... LogConfig ) * WrappedSlogger {
loggers := make ( [ ] * slog . Logger , 0 )
for _ , config := range configs {
opts := & slog . HandlerOptions {
Level : slog . Level ( config . Level ) ,
}
var handler slog . Handler
switch config . Format {
case "json" :
handler = slog . NewJSONHandler ( config . Writer , opts )
case "text" :
handler = slog . NewTextHandler ( config . Writer , opts )
}
loggers = append ( loggers , slog . New ( handler ) )
}
handler := slog . NewTextHandler ( w , opts )
return & WrappedSlogger {
slog . New ( handler ) ,
loggers: loggers ,
}
}
func ( wl * WrappedSlogger ) Error ( msg string , err error , fields watermill . LogFields ) {
attrs := LogFieldsToSlogAttrs ( fields )
wl . LogAttrs ( nil , LevelTrace , msg , attrs ... )
for _ , l := range wl . loggers {
l . LogAttrs ( nil , slog . LevelError , msg , attrs ... )
}
}
func ( wl * WrappedSlogger ) Info ( msg string , fields watermill . LogFields ) {
attrs := LogFieldsToSlogAttrs ( fields )
wl . LogAttrs ( nil , slog . LevelInfo , msg , attrs ... )
for _ , l := range wl . loggers {
l . LogAttrs ( nil , slog . LevelInfo , msg , attrs ... )
}
}
func ( wl * WrappedSlogger ) Debug ( msg string , fields watermill . LogFields ) {
attrs := LogFieldsToSlogAttrs ( fields )
wl . LogAttrs ( nil , slog . LevelDebug , msg , attrs ... )
for _ , l := range wl . loggers {
l . LogAttrs ( nil , slog . LevelDebug , msg , attrs ... )
}
}
func ( wl * WrappedSlogger ) Trace ( msg string , fields watermill . LogFields ) {
attrs := LogFieldsToSlogAttrs ( fields )
wl . LogAttrs ( nil , LevelTrace , msg , attrs ... )
for _ , l := range wl . loggers {
l . LogAttrs ( nil , LevelTrace , msg , attrs ... )
}
}
func ( wl * WrappedSlogger ) With ( fields watermill . LogFields ) watermill . LoggerAdapter {
attrs := LogFieldsToSlogAttrs ( fields )
l := slog . Default ( ) . With ( attrs )
return & WrappedSlogger { l }
newLoggers := make ( [ ] * slog . Logger , 0 )
for _ , l := range wl . loggers {
newLoggers = append ( newLoggers , l . With ( attrs ) )
}
return & WrappedSlogger { loggers : newLoggers }
}