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  }