package log import ( "fmt" "time" ) type envelope struct { log logger lvl level // err is an error attached to the envelope err error args map[string]string } func (e *envelope) Msg(f string, args ...any) { if e.log.Level() < e.lvl { return // No logging } // formatter and output things here E := &envelopeData{*e, time.Now()} msg := fmt.Sprintf(f, args...) loggers[e.log].format.Output(msg, E) e.lvl.Hook(msg) } func (e *envelope) Arg(name string, value any) *envelope { e.args[name] = fmt.Sprintf("%v", value) return e } func (e *envelope) Err(err error) *envelope { e.err = err return e } func (e *envelope) To(l logger) *envelope { e.log = l return e } type Fn func(fmt string, args ...any) func (e *envelope) If(msg func(Fn)) { if e.log.Level() >= e.lvl { msg(e.Msg) } }