logrus.go raw

   1  package logrus
   2  
   3  import (
   4  	"fmt"
   5  	"log"
   6  	"strings"
   7  )
   8  
   9  // Fields type, used to pass to `WithFields`.
  10  type Fields map[string]interface{}
  11  
  12  // Level type
  13  type Level uint32
  14  
  15  // Convert the Level to a string. E.g. PanicLevel becomes "panic".
  16  func (level Level) String() string {
  17  	if b, err := level.MarshalText(); err == nil {
  18  		return string(b)
  19  	} else {
  20  		return "unknown"
  21  	}
  22  }
  23  
  24  // ParseLevel takes a string level and returns the Logrus log level constant.
  25  func ParseLevel(lvl string) (Level, error) {
  26  	switch strings.ToLower(lvl) {
  27  	case "panic":
  28  		return PanicLevel, nil
  29  	case "fatal":
  30  		return FatalLevel, nil
  31  	case "error":
  32  		return ErrorLevel, nil
  33  	case "warn", "warning":
  34  		return WarnLevel, nil
  35  	case "info":
  36  		return InfoLevel, nil
  37  	case "debug":
  38  		return DebugLevel, nil
  39  	case "trace":
  40  		return TraceLevel, nil
  41  	}
  42  
  43  	var l Level
  44  	return l, fmt.Errorf("not a valid logrus Level: %q", lvl)
  45  }
  46  
  47  // UnmarshalText implements encoding.TextUnmarshaler.
  48  func (level *Level) UnmarshalText(text []byte) error {
  49  	l, err := ParseLevel(string(text))
  50  	if err != nil {
  51  		return err
  52  	}
  53  
  54  	*level = l
  55  
  56  	return nil
  57  }
  58  
  59  func (level Level) MarshalText() ([]byte, error) {
  60  	switch level {
  61  	case TraceLevel:
  62  		return []byte("trace"), nil
  63  	case DebugLevel:
  64  		return []byte("debug"), nil
  65  	case InfoLevel:
  66  		return []byte("info"), nil
  67  	case WarnLevel:
  68  		return []byte("warning"), nil
  69  	case ErrorLevel:
  70  		return []byte("error"), nil
  71  	case FatalLevel:
  72  		return []byte("fatal"), nil
  73  	case PanicLevel:
  74  		return []byte("panic"), nil
  75  	}
  76  
  77  	return nil, fmt.Errorf("not a valid logrus level %d", level)
  78  }
  79  
  80  // A constant exposing all logging levels
  81  var AllLevels = []Level{
  82  	PanicLevel,
  83  	FatalLevel,
  84  	ErrorLevel,
  85  	WarnLevel,
  86  	InfoLevel,
  87  	DebugLevel,
  88  	TraceLevel,
  89  }
  90  
  91  // These are the different logging levels. You can set the logging level to log
  92  // on your instance of logger, obtained with `logrus.New()`.
  93  const (
  94  	// PanicLevel level, highest level of severity. Logs and then calls panic with the
  95  	// message passed to Debug, Info, ...
  96  	PanicLevel Level = iota
  97  	// FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the
  98  	// logging level is set to Panic.
  99  	FatalLevel
 100  	// ErrorLevel level. Logs. Used for errors that should definitely be noted.
 101  	// Commonly used for hooks to send errors to an error tracking service.
 102  	ErrorLevel
 103  	// WarnLevel level. Non-critical entries that deserve eyes.
 104  	WarnLevel
 105  	// InfoLevel level. General operational entries about what's going on inside the
 106  	// application.
 107  	InfoLevel
 108  	// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
 109  	DebugLevel
 110  	// TraceLevel level. Designates finer-grained informational events than the Debug.
 111  	TraceLevel
 112  )
 113  
 114  // Won't compile if StdLogger can't be realized by a log.Logger
 115  var (
 116  	_ StdLogger = &log.Logger{}
 117  	_ StdLogger = &Entry{}
 118  	_ StdLogger = &Logger{}
 119  )
 120  
 121  // StdLogger is what your logrus-enabled library should take, that way
 122  // it'll accept a stdlib logger and a logrus logger. There's no standard
 123  // interface, this is the closest we get, unfortunately.
 124  type StdLogger interface {
 125  	Print(...interface{})
 126  	Printf(string, ...interface{})
 127  	Println(...interface{})
 128  
 129  	Fatal(...interface{})
 130  	Fatalf(string, ...interface{})
 131  	Fatalln(...interface{})
 132  
 133  	Panic(...interface{})
 134  	Panicf(string, ...interface{})
 135  	Panicln(...interface{})
 136  }
 137  
 138  // The FieldLogger interface generalizes the Entry and Logger types
 139  type FieldLogger interface {
 140  	WithField(key string, value interface{}) *Entry
 141  	WithFields(fields Fields) *Entry
 142  	WithError(err error) *Entry
 143  
 144  	Debugf(format string, args ...interface{})
 145  	Infof(format string, args ...interface{})
 146  	Printf(format string, args ...interface{})
 147  	Warnf(format string, args ...interface{})
 148  	Warningf(format string, args ...interface{})
 149  	Errorf(format string, args ...interface{})
 150  	Fatalf(format string, args ...interface{})
 151  	Panicf(format string, args ...interface{})
 152  
 153  	Debug(args ...interface{})
 154  	Info(args ...interface{})
 155  	Print(args ...interface{})
 156  	Warn(args ...interface{})
 157  	Warning(args ...interface{})
 158  	Error(args ...interface{})
 159  	Fatal(args ...interface{})
 160  	Panic(args ...interface{})
 161  
 162  	Debugln(args ...interface{})
 163  	Infoln(args ...interface{})
 164  	Println(args ...interface{})
 165  	Warnln(args ...interface{})
 166  	Warningln(args ...interface{})
 167  	Errorln(args ...interface{})
 168  	Fatalln(args ...interface{})
 169  	Panicln(args ...interface{})
 170  
 171  	// IsDebugEnabled() bool
 172  	// IsInfoEnabled() bool
 173  	// IsWarnEnabled() bool
 174  	// IsErrorEnabled() bool
 175  	// IsFatalEnabled() bool
 176  	// IsPanicEnabled() bool
 177  }
 178  
 179  // Ext1FieldLogger (the first extension to FieldLogger) is superfluous, it is
 180  // here for consistancy. Do not use. Use Logger or Entry instead.
 181  type Ext1FieldLogger interface {
 182  	FieldLogger
 183  	Tracef(format string, args ...interface{})
 184  	Trace(args ...interface{})
 185  	Traceln(args ...interface{})
 186  }
 187