/
logger.go
115 lines (95 loc) · 3.12 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package common
import (
"fmt"
"os"
"sync"
)
// Logger represents a minimal levelled logger
type Logger interface {
// Debugf handles debug level messages
Debugf(format string, args ...interface{})
// Infof handles info level messages
Infof(format string, args ...interface{})
// Warnf handles warn level messages
Warnf(format string, args ...interface{})
// Errorf handles error level messages
Errorf(format string, args ...interface{})
// Fatalf handles fatal level messages, and must exit the application
Fatalf(format string, args ...interface{})
// Panicf handles debug level messages, and must panic the application
Panicf(format string, args ...interface{})
}
// StubLogger satisfies the Logger interface, and simply does nothing with
// received messages
type StubLogger struct{}
// Debugf handles debug level messages
func (l *StubLogger) Debugf(format string, args ...interface{}) {}
// Infof handles info level messages
func (l *StubLogger) Infof(format string, args ...interface{}) {}
// Warnf handles warn level messages
func (l *StubLogger) Warnf(format string, args ...interface{}) {}
// Errorf handles error level messages
func (l *StubLogger) Errorf(format string, args ...interface{}) {}
// Fatalf handles fatal level messages, exits the application
func (l *StubLogger) Fatalf(format string, args ...interface{}) {
os.Exit(1)
}
// Panicf handles debug level messages, and panics the application
func (l *StubLogger) Panicf(format string, args ...interface{}) {
panic(fmt.Sprintf(format, args...))
}
type logPrefixer struct {
log Logger
sync.Mutex
}
// Debugf handles debug level messages, prefixing them for golifx
func (l *logPrefixer) Debugf(format string, args ...interface{}) {
l.Lock()
l.log.Debugf(l.prefix(format), args...)
l.Unlock()
}
// Infof handles info level messages, prefixing them for golifx
func (l *logPrefixer) Infof(format string, args ...interface{}) {
l.Lock()
l.log.Infof(l.prefix(format), args...)
l.Unlock()
}
// Warnf handles warn level messages, prefixing them for golifx
func (l *logPrefixer) Warnf(format string, args ...interface{}) {
l.Lock()
l.log.Warnf(l.prefix(format), args...)
l.Unlock()
}
// Errorf handles error level messages, prefixing them for golifx
func (l *logPrefixer) Errorf(format string, args ...interface{}) {
l.Lock()
l.log.Errorf(l.prefix(format), args...)
l.Unlock()
}
// Fatalf handles fatal level messages, prefixing them for golifx
func (l *logPrefixer) Fatalf(format string, args ...interface{}) {
l.Lock()
l.log.Fatalf(l.prefix(format), args...)
l.Unlock()
}
// Panicf handles debug level messages, prefixing them for golifx
func (l *logPrefixer) Panicf(format string, args ...interface{}) {
l.Lock()
l.log.Panicf(l.prefix(format), args...)
l.Unlock()
}
func (l *logPrefixer) prefix(format string) string {
return `[golifx] ` + format
}
var (
// Log holds the global logger used by golifx, can be set via SetLogger() in
// the golifx package
Log Logger
)
func init() {
Log = &logPrefixer{log: new(StubLogger)}
}
// SetLogger wraps the supplied logger with a logPrefixer to denote golifx logs
func SetLogger(logger Logger) {
Log = &logPrefixer{log: logger}
}