github.com/saferwall/pe@v1.5.2/log/std.go (about) 1 package log 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "log" 8 "sync" 9 ) 10 11 var _ Logger = (*stdLogger)(nil) 12 13 type stdLogger struct { 14 log *log.Logger 15 pool *sync.Pool 16 } 17 18 // NewStdLogger new a logger with writer. 19 func NewStdLogger(w io.Writer) Logger { 20 return &stdLogger{ 21 log: log.New(w, "", 0), 22 pool: &sync.Pool{ 23 New: func() interface{} { 24 return new(bytes.Buffer) 25 }, 26 }, 27 } 28 } 29 30 // Log print the kv pairs log. 31 func (l *stdLogger) Log(level Level, keyvals ...interface{}) error { 32 if len(keyvals) == 0 { 33 return nil 34 } 35 if (len(keyvals) & 1) == 1 { 36 keyvals = append(keyvals, "KEYVALS UNPAIRED") 37 } 38 buf := l.pool.Get().(*bytes.Buffer) 39 buf.WriteString(level.String()) 40 for i := 0; i < len(keyvals); i += 2 { 41 _, _ = fmt.Fprintf(buf, " %s=%v", keyvals[i], keyvals[i+1]) 42 } 43 _ = l.log.Output(4, buf.String()) //nolint:gomnd 44 buf.Reset() 45 l.pool.Put(buf) 46 return nil 47 }