github.com/hdt3213/godis@v1.2.9/lib/logger/logger.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "io" 6 "log" 7 "os" 8 "path/filepath" 9 "runtime" 10 "sync" 11 "time" 12 ) 13 14 // Settings stores config for logger 15 type Settings struct { 16 Path string `yaml:"path"` 17 Name string `yaml:"name"` 18 Ext string `yaml:"ext"` 19 TimeFormat string `yaml:"time-format"` 20 } 21 22 var ( 23 logFile *os.File 24 defaultPrefix = "" 25 defaultCallerDepth = 2 26 logger *log.Logger 27 mu sync.Mutex 28 logPrefix = "" 29 levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"} 30 ) 31 32 type logLevel int 33 34 // log levels 35 const ( 36 DEBUG logLevel = iota 37 INFO 38 WARNING 39 ERROR 40 FATAL 41 ) 42 43 const flags = log.LstdFlags 44 45 func init() { 46 logger = log.New(os.Stdout, defaultPrefix, flags) 47 } 48 49 // Setup initializes logger 50 func Setup(settings *Settings) { 51 var err error 52 dir := settings.Path 53 fileName := fmt.Sprintf("%s-%s.%s", 54 settings.Name, 55 time.Now().Format(settings.TimeFormat), 56 settings.Ext) 57 58 logFile, err = mustOpen(fileName, dir) 59 if err != nil { 60 log.Fatalf("logging.Setup err: %s", err) 61 } 62 63 mw := io.MultiWriter(os.Stdout, logFile) 64 logger = log.New(mw, defaultPrefix, flags) 65 } 66 67 func setPrefix(level logLevel) { 68 _, file, line, ok := runtime.Caller(defaultCallerDepth) 69 if ok { 70 logPrefix = fmt.Sprintf("[%s][%s:%d] ", levelFlags[level], filepath.Base(file), line) 71 } else { 72 logPrefix = fmt.Sprintf("[%s] ", levelFlags[level]) 73 } 74 75 logger.SetPrefix(logPrefix) 76 } 77 78 // Debug prints debug log 79 func Debug(v ...interface{}) { 80 mu.Lock() 81 defer mu.Unlock() 82 setPrefix(DEBUG) 83 logger.Println(v...) 84 } 85 86 // Info prints normal log 87 func Info(v ...interface{}) { 88 mu.Lock() 89 defer mu.Unlock() 90 setPrefix(INFO) 91 logger.Println(v...) 92 } 93 94 // Warn prints warning log 95 func Warn(v ...interface{}) { 96 mu.Lock() 97 defer mu.Unlock() 98 setPrefix(WARNING) 99 logger.Println(v...) 100 } 101 102 // Error prints error log 103 func Error(v ...interface{}) { 104 mu.Lock() 105 defer mu.Unlock() 106 setPrefix(ERROR) 107 logger.Println(v...) 108 } 109 110 func Errorf(format string, v ...interface{}) { 111 mu.Lock() 112 defer mu.Unlock() 113 setPrefix(ERROR) 114 logger.Println(fmt.Sprintf(format, v...)) 115 } 116 117 // Fatal prints error log then stop the program 118 func Fatal(v ...interface{}) { 119 mu.Lock() 120 defer mu.Unlock() 121 setPrefix(FATAL) 122 logger.Fatalln(v...) 123 }