66
|
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 }
|