github.com/saferwall/pe@v1.5.2/log/log.go (about) 1 package log 2 3 import ( 4 "context" 5 "log" 6 ) 7 8 // DefaultLogger is default logger. 9 var DefaultLogger = NewStdLogger(log.Writer()) 10 11 // Logger is a logger interface. 12 type Logger interface { 13 Log(level Level, keyvals ...interface{}) error 14 } 15 16 type logger struct { 17 logs []Logger 18 prefix []interface{} 19 hasValuer bool 20 ctx context.Context 21 } 22 23 func (c *logger) Log(level Level, keyvals ...interface{}) error { 24 kvs := make([]interface{}, 0, len(c.prefix)+len(keyvals)) 25 kvs = append(kvs, c.prefix...) 26 if c.hasValuer { 27 bindValues(c.ctx, kvs) 28 } 29 kvs = append(kvs, keyvals...) 30 for _, l := range c.logs { 31 if err := l.Log(level, kvs...); err != nil { 32 return err 33 } 34 } 35 return nil 36 } 37 38 // With with logger fields. 39 func With(l Logger, kv ...interface{}) Logger { 40 if c, ok := l.(*logger); ok { 41 kvs := make([]interface{}, 0, len(c.prefix)+len(kv)) 42 kvs = append(kvs, kv...) 43 kvs = append(kvs, c.prefix...) 44 return &logger{ 45 logs: c.logs, 46 prefix: kvs, 47 hasValuer: containsValuer(kvs), 48 ctx: c.ctx, 49 } 50 } 51 return &logger{logs: []Logger{l}, prefix: kv, hasValuer: containsValuer(kv)} 52 } 53 54 // WithContext returns a shallow copy of l with its context changed 55 // to ctx. The provided ctx must be non-nil. 56 func WithContext(ctx context.Context, l Logger) Logger { 57 if c, ok := l.(*logger); ok { 58 return &logger{ 59 logs: c.logs, 60 prefix: c.prefix, 61 hasValuer: c.hasValuer, 62 ctx: ctx, 63 } 64 } 65 return &logger{logs: []Logger{l}, ctx: ctx} 66 } 67 68 // MultiLogger wraps multi logger. 69 func MultiLogger(logs ...Logger) Logger { 70 return &logger{logs: logs} 71 }