github.com/nsqio/nsq@v1.3.0/internal/lg/lg.go (about) 1 // Package lg provides leveled logging 2 package lg 3 4 import ( 5 "fmt" 6 "log" 7 "os" 8 "strings" 9 ) 10 11 const ( 12 DEBUG = LogLevel(1) 13 INFO = LogLevel(2) 14 WARN = LogLevel(3) 15 ERROR = LogLevel(4) 16 FATAL = LogLevel(5) 17 ) 18 19 type AppLogFunc func(lvl LogLevel, f string, args ...interface{}) 20 21 type Logger interface { 22 Output(maxdepth int, s string) error 23 } 24 25 type NilLogger struct{} 26 27 func (l NilLogger) Output(maxdepth int, s string) error { 28 return nil 29 } 30 31 type LogLevel int 32 33 func (l *LogLevel) Get() interface{} { return *l } 34 35 func (l *LogLevel) Set(s string) error { 36 lvl, err := ParseLogLevel(s) 37 if err != nil { 38 return err 39 } 40 *l = lvl 41 return nil 42 } 43 44 func (l *LogLevel) String() string { 45 switch *l { 46 case DEBUG: 47 return "DEBUG" 48 case INFO: 49 return "INFO" 50 case WARN: 51 return "WARNING" 52 case ERROR: 53 return "ERROR" 54 case FATAL: 55 return "FATAL" 56 } 57 return "invalid" 58 } 59 60 func ParseLogLevel(levelstr string) (LogLevel, error) { 61 switch strings.ToLower(levelstr) { 62 case "debug": 63 return DEBUG, nil 64 case "info": 65 return INFO, nil 66 case "warn": 67 return WARN, nil 68 case "error": 69 return ERROR, nil 70 case "fatal": 71 return FATAL, nil 72 } 73 return 0, fmt.Errorf("invalid log level '%s' (debug, info, warn, error, fatal)", levelstr) 74 } 75 76 func Logf(logger Logger, cfgLevel LogLevel, msgLevel LogLevel, f string, args ...interface{}) { 77 if cfgLevel > msgLevel { 78 return 79 } 80 logger.Output(3, fmt.Sprintf(msgLevel.String()+": "+f, args...)) 81 } 82 83 func LogFatal(prefix string, f string, args ...interface{}) { 84 logger := log.New(os.Stderr, prefix, log.Ldate|log.Ltime|log.Lmicroseconds) 85 Logf(logger, FATAL, FATAL, f, args...) 86 os.Exit(1) 87 }