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  }