package util import ( "fmt" "log" "os" "runtime" "strings" ) var ( _log = NewStdOutLogger("[GO-COMMON]", 3) ) var ( Debugf = _log.Debugf Warnf = _log.Warnf Infof = _log.Infof Errorf = _log.Errorf Fatalf = _log.Fatalf ) func Painc(err error) { if err != nil { Errorf("%v", err) buf := make([]byte, 64<<10) buf = buf[:runtime.Stack(buf, false)] Fatalf("Happened panic:\n%s", buf) } } 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 caller int } func NewStdOutLogger(prefix string, caller int) Logger { if prefix != "" && !strings.HasSuffix(prefix, " ") { prefix = prefix + " " } if caller == 0 { caller = 3 } return &stdOutLogger{ Logger: log.New(os.Stdout, prefix, log.Lshortfile|log.LstdFlags), caller: caller, } } 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(s.caller, 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(levelFatal, fmt.Sprintf(format, v...)) os.Exit(-1) } type ( level int ) const ( levelFatal level = iota + 1 levelError levelWarning levelInfo levelDebug )