package helper import ( "fmt" "log" "os" "path/filepath" "runtime" "time" ) type Level int var ( DefaultPrefix = "" DefaultCallerDepth = 2 logger *log.Logger logPrefix = "" levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"} ) const ( DEBUG Level = iota INFO WARNING ERROR FATAL ) // Setup initialize the log instance func Setup() { logger = log.New(os.Stdout, DefaultPrefix, log.Flags()&^(log.Ldate|log.Ltime)) } // Debug output logs at debug level func Debug(v ...interface{}) { setPrefix(DEBUG) logger.Println(v...) } // Info output logs at info level func Info(v ...interface{}) { setPrefix(INFO) logger.Println(v...) } // Warn output logs at warn level func Warn(v ...interface{}) { setPrefix(WARNING) logger.Println(v...) } // Error output logs at error level func Error(v ...interface{}) { prefix := setPrefix(ERROR) logger.Println(v...) prefix.msg = v } // Fatal output logs at fatal level func Fatal(v ...interface{}) { setPrefix(FATAL) logger.Fatalln(v...) } // setPrefix set the prefix of the log output func setPrefix(level Level) prefix { _, file, line, ok := runtime.Caller(DefaultCallerDepth) if ok { logPrefix = fmt.Sprintf("[%s:%d] [%s] ", filepath.Base(file), line, levelFlags[level]) } else { logPrefix = fmt.Sprintf("[%s] ", levelFlags[level]) } logPrefix += "| " + time.Now().Format("01.02.2006 15:04:05") + " | " logger.SetPrefix(logPrefix) return prefix{prefix: logPrefix} } type prefix struct { prefix string msg interface{} }