comparison vendor/github.com/sirupsen/logrus/logger.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
comparison
equal deleted inserted replaced
65:6d985efa0f7a 66:787b5ee0289d
1 package logrus
2
3 import (
4 "context"
5 "io"
6 "os"
7 "sync"
8 "sync/atomic"
9 "time"
10 )
11
12 // LogFunction For big messages, it can be more efficient to pass a function
13 // and only call it if the log level is actually enables rather than
14 // generating the log message and then checking if the level is enabled
15 type LogFunction func() []interface{}
16
17 type Logger struct {
18 // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
19 // file, or leave it default which is `os.Stderr`. You can also set this to
20 // something more adventurous, such as logging to Kafka.
21 Out io.Writer
22 // Hooks for the logger instance. These allow firing events based on logging
23 // levels and log entries. For example, to send errors to an error tracking
24 // service, log to StatsD or dump the core on fatal errors.
25 Hooks LevelHooks
26 // All log entries pass through the formatter before logged to Out. The
27 // included formatters are `TextFormatter` and `JSONFormatter` for which
28 // TextFormatter is the default. In development (when a TTY is attached) it
29 // logs with colors, but to a file it wouldn't. You can easily implement your
30 // own that implements the `Formatter` interface, see the `README` or included
31 // formatters for examples.
32 Formatter Formatter
33
34 // Flag for whether to log caller info (off by default)
35 ReportCaller bool
36
37 // The logging level the logger should log at. This is typically (and defaults
38 // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
39 // logged.
40 Level Level
41 // Used to sync writing to the log. Locking is enabled by Default
42 mu MutexWrap
43 // Reusable empty entry
44 entryPool sync.Pool
45 // Function to exit the application, defaults to `os.Exit()`
46 ExitFunc exitFunc
47 // The buffer pool used to format the log. If it is nil, the default global
48 // buffer pool will be used.
49 BufferPool BufferPool
50 }
51
52 type exitFunc func(int)
53
54 type MutexWrap struct {
55 lock sync.Mutex
56 disabled bool
57 }
58
59 func (mw *MutexWrap) Lock() {
60 if !mw.disabled {
61 mw.lock.Lock()
62 }
63 }
64
65 func (mw *MutexWrap) Unlock() {
66 if !mw.disabled {
67 mw.lock.Unlock()
68 }
69 }
70
71 func (mw *MutexWrap) Disable() {
72 mw.disabled = true
73 }
74
75 // Creates a new logger. Configuration should be set by changing `Formatter`,
76 // `Out` and `Hooks` directly on the default logger instance. You can also just
77 // instantiate your own:
78 //
79 // var log = &logrus.Logger{
80 // Out: os.Stderr,
81 // Formatter: new(logrus.TextFormatter),
82 // Hooks: make(logrus.LevelHooks),
83 // Level: logrus.DebugLevel,
84 // }
85 //
86 // It's recommended to make this a global instance called `log`.
87 func New() *Logger {
88 return &Logger{
89 Out: os.Stderr,
90 Formatter: new(TextFormatter),
91 Hooks: make(LevelHooks),
92 Level: InfoLevel,
93 ExitFunc: os.Exit,
94 ReportCaller: false,
95 }
96 }
97
98 func (logger *Logger) newEntry() *Entry {
99 entry, ok := logger.entryPool.Get().(*Entry)
100 if ok {
101 return entry
102 }
103 return NewEntry(logger)
104 }
105
106 func (logger *Logger) releaseEntry(entry *Entry) {
107 entry.Data = map[string]interface{}{}
108 logger.entryPool.Put(entry)
109 }
110
111 // WithField allocates a new entry and adds a field to it.
112 // Debug, Print, Info, Warn, Error, Fatal or Panic must be then applied to
113 // this new returned entry.
114 // If you want multiple fields, use `WithFields`.
115 func (logger *Logger) WithField(key string, value interface{}) *Entry {
116 entry := logger.newEntry()
117 defer logger.releaseEntry(entry)
118 return entry.WithField(key, value)
119 }
120
121 // Adds a struct of fields to the log entry. All it does is call `WithField` for
122 // each `Field`.
123 func (logger *Logger) WithFields(fields Fields) *Entry {
124 entry := logger.newEntry()
125 defer logger.releaseEntry(entry)
126 return entry.WithFields(fields)
127 }
128
129 // Add an error as single field to the log entry. All it does is call
130 // `WithError` for the given `error`.
131 func (logger *Logger) WithError(err error) *Entry {
132 entry := logger.newEntry()
133 defer logger.releaseEntry(entry)
134 return entry.WithError(err)
135 }
136
137 // Add a context to the log entry.
138 func (logger *Logger) WithContext(ctx context.Context) *Entry {
139 entry := logger.newEntry()
140 defer logger.releaseEntry(entry)
141 return entry.WithContext(ctx)
142 }
143
144 // Overrides the time of the log entry.
145 func (logger *Logger) WithTime(t time.Time) *Entry {
146 entry := logger.newEntry()
147 defer logger.releaseEntry(entry)
148 return entry.WithTime(t)
149 }
150
151 func (logger *Logger) Logf(level Level, format string, args ...interface{}) {
152 if logger.IsLevelEnabled(level) {
153 entry := logger.newEntry()
154 entry.Logf(level, format, args...)
155 logger.releaseEntry(entry)
156 }
157 }
158
159 func (logger *Logger) Tracef(format string, args ...interface{}) {
160 logger.Logf(TraceLevel, format, args...)
161 }
162
163 func (logger *Logger) Debugf(format string, args ...interface{}) {
164 logger.Logf(DebugLevel, format, args...)
165 }
166
167 func (logger *Logger) Infof(format string, args ...interface{}) {
168 logger.Logf(InfoLevel, format, args...)
169 }
170
171 func (logger *Logger) Printf(format string, args ...interface{}) {
172 entry := logger.newEntry()
173 entry.Printf(format, args...)
174 logger.releaseEntry(entry)
175 }
176
177 func (logger *Logger) Warnf(format string, args ...interface{}) {
178 logger.Logf(WarnLevel, format, args...)
179 }
180
181 func (logger *Logger) Warningf(format string, args ...interface{}) {
182 logger.Warnf(format, args...)
183 }
184
185 func (logger *Logger) Errorf(format string, args ...interface{}) {
186 logger.Logf(ErrorLevel, format, args...)
187 }
188
189 func (logger *Logger) Fatalf(format string, args ...interface{}) {
190 logger.Logf(FatalLevel, format, args...)
191 logger.Exit(1)
192 }
193
194 func (logger *Logger) Panicf(format string, args ...interface{}) {
195 logger.Logf(PanicLevel, format, args...)
196 }
197
198 // Log will log a message at the level given as parameter.
199 // Warning: using Log at Panic or Fatal level will not respectively Panic nor Exit.
200 // For this behaviour Logger.Panic or Logger.Fatal should be used instead.
201 func (logger *Logger) Log(level Level, args ...interface{}) {
202 if logger.IsLevelEnabled(level) {
203 entry := logger.newEntry()
204 entry.Log(level, args...)
205 logger.releaseEntry(entry)
206 }
207 }
208
209 func (logger *Logger) LogFn(level Level, fn LogFunction) {
210 if logger.IsLevelEnabled(level) {
211 entry := logger.newEntry()
212 entry.Log(level, fn()...)
213 logger.releaseEntry(entry)
214 }
215 }
216
217 func (logger *Logger) Trace(args ...interface{}) {
218 logger.Log(TraceLevel, args...)
219 }
220
221 func (logger *Logger) Debug(args ...interface{}) {
222 logger.Log(DebugLevel, args...)
223 }
224
225 func (logger *Logger) Info(args ...interface{}) {
226 logger.Log(InfoLevel, args...)
227 }
228
229 func (logger *Logger) Print(args ...interface{}) {
230 entry := logger.newEntry()
231 entry.Print(args...)
232 logger.releaseEntry(entry)
233 }
234
235 func (logger *Logger) Warn(args ...interface{}) {
236 logger.Log(WarnLevel, args...)
237 }
238
239 func (logger *Logger) Warning(args ...interface{}) {
240 logger.Warn(args...)
241 }
242
243 func (logger *Logger) Error(args ...interface{}) {
244 logger.Log(ErrorLevel, args...)
245 }
246
247 func (logger *Logger) Fatal(args ...interface{}) {
248 logger.Log(FatalLevel, args...)
249 logger.Exit(1)
250 }
251
252 func (logger *Logger) Panic(args ...interface{}) {
253 logger.Log(PanicLevel, args...)
254 }
255
256 func (logger *Logger) TraceFn(fn LogFunction) {
257 logger.LogFn(TraceLevel, fn)
258 }
259
260 func (logger *Logger) DebugFn(fn LogFunction) {
261 logger.LogFn(DebugLevel, fn)
262 }
263
264 func (logger *Logger) InfoFn(fn LogFunction) {
265 logger.LogFn(InfoLevel, fn)
266 }
267
268 func (logger *Logger) PrintFn(fn LogFunction) {
269 entry := logger.newEntry()
270 entry.Print(fn()...)
271 logger.releaseEntry(entry)
272 }
273
274 func (logger *Logger) WarnFn(fn LogFunction) {
275 logger.LogFn(WarnLevel, fn)
276 }
277
278 func (logger *Logger) WarningFn(fn LogFunction) {
279 logger.WarnFn(fn)
280 }
281
282 func (logger *Logger) ErrorFn(fn LogFunction) {
283 logger.LogFn(ErrorLevel, fn)
284 }
285
286 func (logger *Logger) FatalFn(fn LogFunction) {
287 logger.LogFn(FatalLevel, fn)
288 logger.Exit(1)
289 }
290
291 func (logger *Logger) PanicFn(fn LogFunction) {
292 logger.LogFn(PanicLevel, fn)
293 }
294
295 func (logger *Logger) Logln(level Level, args ...interface{}) {
296 if logger.IsLevelEnabled(level) {
297 entry := logger.newEntry()
298 entry.Logln(level, args...)
299 logger.releaseEntry(entry)
300 }
301 }
302
303 func (logger *Logger) Traceln(args ...interface{}) {
304 logger.Logln(TraceLevel, args...)
305 }
306
307 func (logger *Logger) Debugln(args ...interface{}) {
308 logger.Logln(DebugLevel, args...)
309 }
310
311 func (logger *Logger) Infoln(args ...interface{}) {
312 logger.Logln(InfoLevel, args...)
313 }
314
315 func (logger *Logger) Println(args ...interface{}) {
316 entry := logger.newEntry()
317 entry.Println(args...)
318 logger.releaseEntry(entry)
319 }
320
321 func (logger *Logger) Warnln(args ...interface{}) {
322 logger.Logln(WarnLevel, args...)
323 }
324
325 func (logger *Logger) Warningln(args ...interface{}) {
326 logger.Warnln(args...)
327 }
328
329 func (logger *Logger) Errorln(args ...interface{}) {
330 logger.Logln(ErrorLevel, args...)
331 }
332
333 func (logger *Logger) Fatalln(args ...interface{}) {
334 logger.Logln(FatalLevel, args...)
335 logger.Exit(1)
336 }
337
338 func (logger *Logger) Panicln(args ...interface{}) {
339 logger.Logln(PanicLevel, args...)
340 }
341
342 func (logger *Logger) Exit(code int) {
343 runHandlers()
344 if logger.ExitFunc == nil {
345 logger.ExitFunc = os.Exit
346 }
347 logger.ExitFunc(code)
348 }
349
350 //When file is opened with appending mode, it's safe to
351 //write concurrently to a file (within 4k message on Linux).
352 //In these cases user can choose to disable the lock.
353 func (logger *Logger) SetNoLock() {
354 logger.mu.Disable()
355 }
356
357 func (logger *Logger) level() Level {
358 return Level(atomic.LoadUint32((*uint32)(&logger.Level)))
359 }
360
361 // SetLevel sets the logger level.
362 func (logger *Logger) SetLevel(level Level) {
363 atomic.StoreUint32((*uint32)(&logger.Level), uint32(level))
364 }
365
366 // GetLevel returns the logger level.
367 func (logger *Logger) GetLevel() Level {
368 return logger.level()
369 }
370
371 // AddHook adds a hook to the logger hooks.
372 func (logger *Logger) AddHook(hook Hook) {
373 logger.mu.Lock()
374 defer logger.mu.Unlock()
375 logger.Hooks.Add(hook)
376 }
377
378 // IsLevelEnabled checks if the log level of the logger is greater than the level param
379 func (logger *Logger) IsLevelEnabled(level Level) bool {
380 return logger.level() >= level
381 }
382
383 // SetFormatter sets the logger formatter.
384 func (logger *Logger) SetFormatter(formatter Formatter) {
385 logger.mu.Lock()
386 defer logger.mu.Unlock()
387 logger.Formatter = formatter
388 }
389
390 // SetOutput sets the logger output.
391 func (logger *Logger) SetOutput(output io.Writer) {
392 logger.mu.Lock()
393 defer logger.mu.Unlock()
394 logger.Out = output
395 }
396
397 func (logger *Logger) SetReportCaller(reportCaller bool) {
398 logger.mu.Lock()
399 defer logger.mu.Unlock()
400 logger.ReportCaller = reportCaller
401 }
402
403 // ReplaceHooks replaces the logger hooks and returns the old ones
404 func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks {
405 logger.mu.Lock()
406 oldHooks := logger.Hooks
407 logger.Hooks = hooks
408 logger.mu.Unlock()
409 return oldHooks
410 }
411
412 // SetBufferPool sets the logger buffer pool.
413 func (logger *Logger) SetBufferPool(pool BufferPool) {
414 logger.mu.Lock()
415 defer logger.mu.Unlock()
416 logger.BufferPool = pool
417 }