package log import ( "bytes" "os" "path/filepath" "strconv" "sync" "time" ) /* var ( fmtBuffer = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) }, } ) */ // TextFormatter is a text line formatter type TextFormatter struct { AppName string TimeFormat string init sync.Once host []byte app []byte pid []byte isterm bool } // Format implements Formatter func (f *TextFormatter) Format(level Level, msg string, logger *Logger) []byte { // output format: DATE LEVEL HOST APP PID file:line message // 2001-10-10T12:00:00,000+0800 INFO web-1 app 1234 main/main.go:1234 message ... f.init.Do(func() { if f.AppName == "" { f.AppName = filepath.Base(os.Args[0]) } f.app = []byte(f.AppName) if f.TimeFormat == "" { f.TimeFormat = "2006-01-02T15:04:05.000-0700" } f.isterm = IsTerminal(logger.Out) host, _ := os.Hostname() f.host = []byte(host) f.pid = []byte(strconv.Itoa(os.Getpid())) }) //buf := fmtBuffer.Get().(*bytes.Buffer) //buf.Reset() //defer fmtBuffer.Put(buf) buf := new(bytes.Buffer) // timestamp timeStr := time.Now().Format(f.TimeFormat) buf.WriteString(timeStr) /* // host buf.WriteByte(' ') buf.Write(f.host) // name buf.WriteByte(' ') buf.Write(f.app) // pid buf.WriteByte(' ') buf.Write(f.pid) */ // file, line file, line := FilelineCaller(4) buf.WriteString(" [") buf.WriteString(file) buf.WriteByte(':') buf.WriteString(strconv.Itoa(line)) buf.WriteString("]") // level buf.WriteByte(' ') if f.isterm { buf.WriteString(level.ColorString()) } else { buf.WriteString(level.String()) } // msg buf.WriteString(": ") buf.WriteString(msg) // newline if msg[len(msg)-1] != '\n' { buf.WriteByte('\n') } return buf.Bytes() }