...
1 package ldlog
2
3 import (
4 "log"
5 "os"
6 "strings"
7 )
8
9
10
11
12
13
14 type BaseLogger interface {
15
16 Println(values ...interface{})
17
18 Printf(format string, values ...interface{})
19 }
20
21
22 type LogLevel int
23
24
25 func (level LogLevel) Name() string {
26 switch level {
27 case Debug:
28 return "Debug"
29 case Info:
30 return "Info"
31 case Warn:
32 return "Warn"
33 case Error:
34 return "Error"
35 case None:
36 return "None"
37 }
38 return "?"
39 }
40
41
42 func (level LogLevel) String() string {
43 return level.Name()
44 }
45
46 const (
47 _ = iota
48
49
50 Debug LogLevel = iota
51
52
53 Info LogLevel = iota
54
55
56 Warn LogLevel = iota
57
58
59 Error LogLevel = iota
60
61 None LogLevel = iota
62 )
63
64
65
66
67
68 type Loggers struct {
69 debugLog levelLogger
70 infoLog levelLogger
71 warnLog levelLogger
72 errorLog levelLogger
73 baseLogger BaseLogger
74 minLevel LogLevel
75 prefix string
76 inited bool
77 }
78
79 type levelLogger struct {
80 baseLogger BaseLogger
81 enabled bool
82 prefix string
83 overrideLogger bool
84 }
85
86 var nullLog = levelLogger{enabled: false}
87
88
89 func NewDisabledLoggers() Loggers {
90 ret := Loggers{}
91 ret.SetBaseLogger(nullLog)
92 ret.SetMinLevel(None)
93 return ret
94 }
95
96
97 func (l Loggers) Debug(values ...interface{}) {
98 l.ForLevel(Debug).Println(values...)
99 }
100
101
102
103 func (l Loggers) Debugf(format string, values ...interface{}) {
104 l.ForLevel(Debug).Printf(format, values...)
105 }
106
107
108 func (l Loggers) Info(values ...interface{}) {
109 l.ForLevel(Info).Println(values...)
110 }
111
112
113
114 func (l Loggers) Infof(format string, values ...interface{}) {
115 l.ForLevel(Info).Printf(format, values...)
116 }
117
118
119 func (l Loggers) Warn(values ...interface{}) {
120 l.ForLevel(Warn).Println(values...)
121 }
122
123
124
125 func (l Loggers) Warnf(format string, values ...interface{}) {
126 l.ForLevel(Warn).Printf(format, values...)
127 }
128
129
130 func (l Loggers) Error(values ...interface{}) {
131 l.ForLevel(Error).Println(values...)
132 }
133
134
135
136 func (l Loggers) Errorf(format string, values ...interface{}) {
137 l.ForLevel(Error).Printf(format, values...)
138 }
139
140
141
142
143
144
145 func NewDefaultLoggers() Loggers {
146 ret := Loggers{}
147 ret.SetMinLevel(Info)
148 return ret
149 }
150
151
152
153
154
155
156 func (l *Loggers) Init() {
157 l.ensureInited()
158 }
159
160
161
162
163
164
165 func (l *Loggers) SetBaseLogger(baseLogger BaseLogger) {
166 l.ensureInited()
167 if baseLogger == nil {
168 return
169 }
170 l.baseLogger = baseLogger
171 for _, levelLogger := range l.allLevels() {
172 if !levelLogger.overrideLogger {
173 levelLogger.baseLogger = baseLogger
174 }
175 }
176 }
177
178
179
180
181
182 func (l *Loggers) SetBaseLoggerForLevel(level LogLevel, baseLogger BaseLogger) {
183 l.ensureInited()
184 levelLogger := l.levelLogger(level)
185 if levelLogger != nil {
186 if baseLogger == nil {
187 levelLogger.baseLogger = l.baseLogger
188 levelLogger.overrideLogger = false
189 } else {
190 levelLogger.baseLogger = baseLogger
191 levelLogger.overrideLogger = true
192 }
193 }
194 }
195
196
197
198
199
200
201
202 func (l Loggers) ForLevel(level LogLevel) BaseLogger {
203 if level >= l.minLevel {
204 lll := l.levelLogger(level)
205 if lll != nil {
206 return *lll
207 }
208 }
209 return nullLog
210 }
211
212
213
214
215 func (l *Loggers) SetMinLevel(minLevel LogLevel) {
216 l.ensureInited()
217 l.minLevel = minLevel
218 l.configureLevels()
219 }
220
221
222 func (l Loggers) GetMinLevel() LogLevel {
223 if l.minLevel == 0 {
224 return Info
225 }
226 return l.minLevel
227 }
228
229
230
231
232
233
234
235
236 func (l Loggers) IsDebugEnabled() bool {
237 return l.GetMinLevel() == Debug
238 }
239
240
241
242 func (l *Loggers) SetPrefix(prefix string) {
243 l.ensureInited()
244 l.prefix = prefix
245 l.configureLevels()
246 }
247
248 func (l *Loggers) ensureInited() {
249 if l.inited {
250 return
251 }
252 l.minLevel = Info
253 l.baseLogger = log.New(os.Stderr, "[LaunchDarkly] ", log.LstdFlags)
254 for _, levelLogger := range l.allLevels() {
255 levelLogger.baseLogger = l.baseLogger
256 }
257 l.configureLevels()
258 l.inited = true
259 }
260
261 func (l *Loggers) configureLevels() {
262 for level, levelLogger := range l.allLevels() {
263 levelLogger.enabled = level >= l.minLevel
264 levelLogger.prefix = strings.ToUpper(level.Name()) + ":"
265 if l.prefix != "" {
266 levelLogger.prefix = levelLogger.prefix + " " + l.prefix
267 }
268 }
269 }
270
271 func (l *Loggers) allLevels() map[LogLevel]*levelLogger {
272 return map[LogLevel]*levelLogger{
273 Debug: &l.debugLog,
274 Info: &l.infoLog,
275 Warn: &l.warnLog,
276 Error: &l.errorLog,
277 }
278 }
279
280 func (l *Loggers) levelLogger(level LogLevel) *levelLogger {
281 switch level {
282 case Debug:
283 return &l.debugLog
284 case Info:
285 return &l.infoLog
286 case Warn:
287 return &l.warnLog
288 case Error:
289 return &l.errorLog
290 }
291 return nil
292 }
293
294 func (ll levelLogger) Println(values ...interface{}) {
295 if ll.enabled && ll.baseLogger != nil {
296 if len(values) == 1 {
297 ll.baseLogger.Println(ll.prefix, values[0])
298 } else {
299 vs := make([]interface{}, len(values)+1)
300 vs[0] = ll.prefix
301 for i := range values {
302 vs[i+1] = values[i]
303 }
304 ll.baseLogger.Println(vs...)
305 }
306 }
307 }
308
309 func (ll levelLogger) Printf(format string, args ...interface{}) {
310 if ll.enabled && ll.baseLogger != nil {
311 ll.baseLogger.Printf(ll.prefix+" "+format, args...)
312 }
313 }
314
View as plain text