package lormatter import ( "bytes" "fmt" "os" "path/filepath" "strings" "time" "github.com/sirupsen/logrus" ) var ( workspace string // 工作目录 ) func init() { workspace, _ = os.Getwd() workspace = filepath.ToSlash(workspace) } // Formatter implements logrus.Formatter interface. type Formatter struct { ShowTime bool // show time ShowFile bool // show file name and line ShowFunc bool // show func name when call ShowField bool // show custom field TimeLayout string // time layout } func (f *Formatter) shortLevel(level logrus.Level) string { switch level { case logrus.DebugLevel: return "DEBU" case logrus.InfoLevel: return "INFO" case logrus.WarnLevel: return "WARN" case logrus.ErrorLevel: return "ERRO" case logrus.FatalLevel: return "FATAL" case logrus.PanicLevel: return "PANIC" default: return "INFO" } } // Format building log message. func (f *Formatter) Format(entry *logrus.Entry) ([]byte, error) { var builder bytes.Buffer if f.ShowTime { if f.TimeLayout == "" { f.TimeLayout = time.DateTime } builder.WriteString(entry.Time.Format(f.TimeLayout)) builder.WriteString(" ") } if f.ShowFile { content := fmt.Sprintf("[%s:%d] ", strings.ReplaceAll(entry.Caller.File, workspace, "."), entry.Caller.Line) builder.WriteString(content) } if f.ShowFunc { s := strings.Split(entry.Caller.Function, ".") content := fmt.Sprintf("[%s()] ", s[len(s)-1]) builder.WriteString(content) } builder.WriteString("[" + f.shortLevel(entry.Level) + "] ") if f.ShowField { for k, val := range entry.Data { builder.WriteString(fmt.Sprintf("[%s=%v] ", k, val)) } } builder.WriteString(entry.Message) builder.WriteRune('\n') return builder.Bytes(), nil } // Register auto set formatter object for logrus. func (f *Formatter) Register() { logrus.SetFormatter(f) logrus.SetReportCaller(true) }