package logger import ( "errors" "fmt" "log" "os" "strings" ) const ( exit = -1 ) var ( ExitError = errors.New("exit error") ) type Logger interface { Debugf(format string, v ...interface{}) Infof(format string, v ...interface{}) Errorf(format string, v ...interface{}) Warnf(format string, v ...interface{}) Fatalf(format string, v ...interface{}) } type stdOutLogger struct { *log.Logger } func NewStdOutLogger(prefix string) Logger { if prefix != "" && !strings.HasSuffix(prefix, " ") { prefix = prefix + " " } return &stdOutLogger{ Logger: log.New(os.Stdout, prefix, log.Lshortfile|log.LstdFlags), } } func (s *stdOutLogger) output(level level, str string) { formatStr := "" switch level { case levelFatal: formatStr = "\033[35m[FATAL]\033[0m " + str case levelError: formatStr = "\033[31m[ERROR]\033[0m " + str case levelWarning: formatStr = "\033[33m[WARN]\033[0m " + str case levelInfo: formatStr = "\033[32m[INFO]\033[0m " + str case levelDebug: formatStr = "\033[36m[DEBUG]\033[0m " + str } _ = s.Output(3, formatStr) } func (s *stdOutLogger) Debugf(format string, v ...interface{}) { s.output(levelDebug, fmt.Sprintf(format, v...)) } func (s *stdOutLogger) Infof(format string, v ...interface{}) { s.output(levelInfo, fmt.Sprintf(format, v...)) } func (s *stdOutLogger) Warnf(format string, v ...interface{}) { s.output(levelWarning, fmt.Sprintf(format, v...)) } func (s *stdOutLogger) Errorf(format string, v ...interface{}) { s.output(levelError, fmt.Sprintf(format, v...)) } func (s *stdOutLogger) Fatalf(format string, v ...interface{}) { s.output(levelError, fmt.Sprintf(format, v...)) //os.Exit(exit) panic(ExitError) } type ( level int ) const ( levelFatal level = iota + 1 levelError levelWarning levelInfo levelDebug )