1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
# Printf func (format string, v ...interface{}) { std.Output(2, fmt.Sprintf(format, v...)) }
# std 启用的是系统标准错误流 var std = New(os.Stderr, "", LstdFlags)
func New(out io.Writer, prefix string, flag int) *Logger { return &Logger{out: out, prefix: prefix, flag: flag} }
# Logger type Logger struct { mu sync.Mutex prefix string flag int out io.Writer buf []byte }
func (l *Logger) Output(calldepth int, s string) error { now := time.Now() var file string var line int l.mu.Lock() defer l.mu.Unlock() if l.flag&(Lshortfile|Llongfile) != 0 { l.mu.Unlock() var ok bool _, file, line, ok = runtime.Caller(calldepth) if !ok { file = "???" line = 0 } l.mu.Lock() } l.buf = l.buf[:0] l.formatHeader(&l.buf, now, file, line) l.buf = append(l.buf, s...) if len(s) == 0 || s[len(s)-1] != 'n' { l.buf = append(l.buf, 'n') } _, err := l.out.Write(l.buf) return err }
|
近期评论