github.com/dnephin/dobi@v0.15.0/logging/formatter.go (about) 1 package logging 2 3 import ( 4 "bytes" 5 "fmt" 6 "strings" 7 8 log "github.com/sirupsen/logrus" 9 ) 10 11 const ( 12 red = 31 13 yellow = 33 14 gray = 90 15 ) 16 17 // LogRepresenter is an interface for objects that can format themselves for 18 // logging 19 type LogRepresenter interface { 20 Repr() string 21 } 22 23 // Formatter formats a log entry in a human readable way 24 type Formatter struct{} 25 26 // Format implements the log.Formatter interface 27 func (f *Formatter) Format(entry *log.Entry) ([]byte, error) { 28 buff := &bytes.Buffer{} 29 buff.WriteString(writeLevel(entry.Level)) 30 buff.WriteString(writeData(entry.Data)) 31 buff.WriteString(entry.Message) 32 buff.WriteString("\n") 33 return buff.Bytes(), nil 34 } 35 36 func withColor(color int, msg string) string { 37 return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color, msg) 38 } 39 40 func writeLevel(level log.Level) string { 41 switch level { 42 case log.DebugLevel: 43 return fmt.Sprintf("[%s] ", withColor(gray, "DEBUG")) 44 case log.WarnLevel: 45 return fmt.Sprintf("[%s] ", withColor(yellow, "WARN")) 46 case log.ErrorLevel, log.FatalLevel, log.PanicLevel: 47 return fmt.Sprintf("[%s] ", withColor(red, "ERROR")) 48 default: 49 return "" 50 } 51 } 52 53 func writeData(fields log.Fields) string { 54 buff := []string{} 55 for key, value := range fields { 56 switch value := value.(type) { 57 case LogRepresenter: 58 buff = append(buff, value.Repr()) 59 default: 60 buff = append(buff, fmt.Sprintf("%v=%v", key, value)) 61 } 62 } 63 if len(buff) > 0 { 64 buff = append(buff, "") 65 } 66 return strings.Join(buff, " ") 67 }