github.com/0chain/gosdk@v1.17.11/core/logger/logger.go (about) 1 // Provides a simple logger for the SDK. 2 package logger 3 4 import ( 5 "fmt" 6 "io" 7 "log" 8 "os" 9 ) 10 11 const ( 12 NONE = 0 13 FATAL = 1 14 ERROR = 2 15 INFO = 3 16 DEBUG = 4 17 ) 18 19 const cRed = "\u001b[31m" 20 const cReset = "\u001b[0m" 21 22 const ( 23 strFATAL = cRed + "[FATAL] " 24 strERROR = cRed + "[ERROR] " 25 strINFO = "[INFO] " 26 strDEBUG = "[DEBUG] " 27 ) 28 29 type Logger struct { 30 lvl int 31 prefix string 32 logDebug *log.Logger 33 logInfo *log.Logger 34 logError *log.Logger 35 logFatal *log.Logger 36 fWriter io.Writer 37 } 38 39 // Init - Initialize logging 40 func (l *Logger) Init(lvl int, prefix string) { 41 l.SetLevel(lvl) 42 l.prefix = prefix 43 l.logDebug = log.New(os.Stderr, prefix+": "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 44 l.logInfo = log.New(os.Stderr, prefix+": "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 45 l.logError = log.New(os.Stderr, prefix+": "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 46 l.logFatal = log.New(os.Stderr, prefix+": "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 47 } 48 49 // SetLevel - Configures the log level. Higher the number more verbose. 50 func (l *Logger) SetLevel(lvl int) { 51 l.lvl = lvl 52 } 53 54 // syncPrefixes - syncs the logger prefixes 55 func syncPrefixes(maxPrefixLen int, loggers []*Logger) { 56 for _, lgr := range loggers { 57 if maxPrefixLen-len(lgr.prefix) > 0 { 58 lgr.prefix = fmt.Sprintf("%-*s", maxPrefixLen, lgr.prefix) 59 } 60 } 61 } 62 63 // SyncLoggers syncs the loggers prefixes 64 // - loggers is the list of loggers to sync 65 func SyncLoggers(loggers []*Logger) { 66 maxPrefixLen := 0 67 for _, lgr := range loggers { 68 if len(lgr.prefix) > maxPrefixLen { 69 maxPrefixLen = len(lgr.prefix) 70 } 71 } 72 syncPrefixes(maxPrefixLen, loggers) 73 } 74 75 // SetLogFile - Writes log to the file. set verbose false disables log to os.Stderr 76 func (l *Logger) SetLogFile(logFile io.Writer, verbose bool) { 77 dLogs := []io.Writer{logFile} 78 iLogs := []io.Writer{logFile} 79 eLogs := []io.Writer{logFile} 80 fLogs := []io.Writer{logFile} 81 if verbose { 82 dLogs = append(dLogs, os.Stderr) 83 iLogs = append(iLogs, os.Stderr) 84 eLogs = append(eLogs, os.Stderr) 85 fLogs = append(fLogs, os.Stderr) 86 } 87 l.logDebug = log.New(io.MultiWriter(dLogs...), l.prefix+" "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 88 l.logInfo = log.New(io.MultiWriter(iLogs...), l.prefix+" "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 89 l.logError = log.New(io.MultiWriter(eLogs...), l.prefix+" "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 90 l.logFatal = log.New(io.MultiWriter(fLogs...), l.prefix+" "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile) 91 } 92 93 func (l *Logger) Debug(v ...interface{}) { 94 if l.lvl >= DEBUG { 95 l.logDebug.Output(2, fmt.Sprint(v...)) 96 } 97 } 98 99 func (l *Logger) Info(v ...interface{}) { 100 if l.lvl >= INFO { 101 l.logInfo.Output(2, fmt.Sprint(v...)) 102 } 103 } 104 105 func (l *Logger) Error(v ...interface{}) { 106 if l.lvl >= ERROR { 107 l.logError.Output(2, fmt.Sprint(v...)+cReset) 108 } 109 } 110 111 func (l *Logger) Fatal(v ...interface{}) { 112 if l.lvl >= FATAL { 113 l.logFatal.Output(2, fmt.Sprint(v...)+cReset) 114 } 115 } 116 117 func (l *Logger) Close() { 118 if c, ok := l.fWriter.(io.Closer); ok && c != nil { 119 c.Close() 120 } 121 }