package log import ( "fmt" "github.com/davecgh/go-spew/spew" "os" "path/filepath" "runtime" "time" ) var level = 0 const ( // TRACE level TRACE = 0 // DEBUG level DEBUG = 1 // INFO level INFO = 2 // WARNING level WARNING = 3 // ERROR level ERROR = 4 // FATAL level FATAL = 5 ) // Stringer interface type Stringer interface { LogString() string } // Init logger func Init(plevel int) { level = plevel spew.Config.DisableMethods = true spew.Config.Indent = " " } // Dumpf object func Dumpf(format string, a ...interface{}) string { return spew.Sprintf(format, a...) } // Dump object func Dump(a ...interface{}) string { return spew.Sdump(a...) } func dump(a ...interface{}) []interface{} { for ai, av := range a { if avf, ok := av.(func() string); ok { a[ai] = avf() } else if avf, ok := av.(Stringer); ok { a[ai] = avf.LogString() } else if avf, ok := av.(fmt.GoStringer); ok { a[ai] = avf.GoString() } else if avf, ok := av.(fmt.Stringer); ok { a[ai] = avf.String() } } return a } // Trace log func Trace(a ...interface{}) { if level <= TRACE { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("TRACE: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprint(dump(a...)...)) } } // Tracef log func Tracef(format string, a ...interface{}) { if level <= TRACE { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("TRACE: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprintf(format, dump(a...)...)) } } // Debug log func Debug(a ...interface{}) { if level <= DEBUG { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("DEBUG: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprint(dump(a...)...)) } } // Debugf log func Debugf(format string, a ...interface{}) { if level <= DEBUG { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("DEBUG: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprintf(format, dump(a...)...)) } } // Info log func Info(a ...interface{}) { if level <= INFO { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("INFO: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprint(dump(a...)...)) } } // Infof log func Infof(format string, a ...interface{}) { if level <= INFO { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("INFO: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprintf(format, dump(a...)...)) } } // Warning log func Warning(a ...interface{}) { if level <= WARNING { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("WARN: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprint(dump(a...)...)) } } // Warningf log func Warningf(format string, a ...interface{}) { if level <= WARNING { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Printf("WARN: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprintf(format, dump(a...)...)) } } // Error log func Error(a ...interface{}) { if level <= ERROR { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Fprintf(os.Stderr, "ERROR: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprint(dump(a...)...)) } } // Errorf log func Errorf(format string, a ...interface{}) { if level <= ERROR { _, path, line, _ := runtime.Caller(1) _, file := filepath.Split(path) fmt.Fprintf(os.Stderr, "ERROR: %s %v:%v: %s\n", time.Now().Format("01:04:05.000"), file, line, fmt.Sprintf(format, dump(a...)...)) } }