nvidia-container-toolkit/vendor/github.com/tsaikd/KDGoLib/logrusutil/ConsoleLogFormatter.go

107 lines
2.6 KiB
Go
Raw Permalink Normal View History

package logrusutil
import (
"bytes"
"fmt"
"strings"
"time"
"github.com/sirupsen/logrus"
"github.com/tsaikd/KDGoLib/errutil"
"github.com/tsaikd/KDGoLib/runtimecaller"
)
// flags
const (
Llongfile = 1 << iota
Lshortfile
Ltime
Llevel
LstdFlags = Ltime | Lshortfile | Llevel
)
// ConsoleLogFormatter suitable formatter for console
type ConsoleLogFormatter struct {
TimestampFormat string
Flag int
CallerOffset int
RuntimeCallerFilters []runtimecaller.Filter
}
func addspace(text string, addspaceflag bool) (string, bool) {
if addspaceflag {
return " " + text, true
}
return text, true
}
func filterLogrusRuntimeCaller(callinfo runtimecaller.CallInfo) (valid bool, stop bool) {
return !strings.Contains(callinfo.PackageName(), "github.com/sirupsen/logrus"), false
}
// Format output logrus entry
func (t *ConsoleLogFormatter) Format(entry *logrus.Entry) (data []byte, err error) {
buffer := bytes.Buffer{}
addspaceflag := false
if t.Flag == 0 {
t.Flag = LstdFlags
}
if t.TimestampFormat == "" {
t.TimestampFormat = time.RFC3339
}
if t.Flag&Ltime != 0 {
timetext := entry.Time.Format(t.TimestampFormat)
timetext, addspaceflag = addspace(timetext, addspaceflag)
if _, err = buffer.WriteString(timetext); err != nil {
err = errutil.New("write timestamp to buffer failed", err)
return
}
}
if t.Flag&(Lshortfile|Llongfile) != 0 {
var filelinetext string
filters := append([]runtimecaller.Filter{filterLogrusRuntimeCaller}, t.RuntimeCallerFilters...)
if callinfo, ok := errutil.RuntimeCaller(1+t.CallerOffset, filters...); ok {
if t.Flag&Lshortfile != 0 {
filelinetext = fmt.Sprintf("%s:%d", callinfo.FileName(), callinfo.Line())
} else {
filelinetext = fmt.Sprintf("%s/%s:%d", callinfo.PackageName(), callinfo.FileName(), callinfo.Line())
}
filelinetext, addspaceflag = addspace(filelinetext, addspaceflag)
}
if _, err = buffer.WriteString(filelinetext); err != nil {
err = errutil.New("write fileline to buffer failed", err)
return
}
}
if t.Flag&Llevel != 0 {
leveltext := fmt.Sprintf("[%s]", entry.Level.String())
leveltext, addspaceflag = addspace(leveltext, addspaceflag)
if _, err = buffer.WriteString(leveltext); err != nil {
err = errutil.New("write level to buffer failed", err)
return
}
}
message := entry.Message
message, _ = addspace(message, addspaceflag)
if _, err = buffer.WriteString(message); err != nil {
err = errutil.New("write message to buffer failed", err)
return
}
if err = buffer.WriteByte('\n'); err != nil {
err = errutil.New("write newline to buffer failed", err)
return
}
data = buffer.Bytes()
return
}