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  }