@@ -143,7 +143,7 @@ type MultiChannelledLog struct {
143
143
name string
144
144
bufferLength int64
145
145
queue chan * Event
146
- mutex sync.Mutex
146
+ rwmutex sync.RWMutex
147
147
loggers map [string ]EventLogger
148
148
flush chan bool
149
149
close chan bool
@@ -173,10 +173,10 @@ func NewMultiChannelledLog(name string, bufferLength int64) *MultiChannelledLog
173
173
174
174
// AddLogger adds a logger to this MultiChannelledLog
175
175
func (m * MultiChannelledLog ) AddLogger (logger EventLogger ) error {
176
- m .mutex .Lock ()
176
+ m .rwmutex .Lock ()
177
177
name := logger .GetName ()
178
178
if _ , has := m .loggers [name ]; has {
179
- m .mutex .Unlock ()
179
+ m .rwmutex .Unlock ()
180
180
return ErrDuplicateName {name }
181
181
}
182
182
m .loggers [name ] = logger
@@ -186,7 +186,7 @@ func (m *MultiChannelledLog) AddLogger(logger EventLogger) error {
186
186
if logger .GetStacktraceLevel () < m .stacktraceLevel {
187
187
m .stacktraceLevel = logger .GetStacktraceLevel ()
188
188
}
189
- m .mutex .Unlock ()
189
+ m .rwmutex .Unlock ()
190
190
go m .Start ()
191
191
return nil
192
192
}
@@ -195,31 +195,31 @@ func (m *MultiChannelledLog) AddLogger(logger EventLogger) error {
195
195
// NB: If you delete the last sublogger this logger will simply drop
196
196
// log events
197
197
func (m * MultiChannelledLog ) DelLogger (name string ) bool {
198
- m .mutex .Lock ()
198
+ m .rwmutex .Lock ()
199
199
logger , has := m .loggers [name ]
200
200
if ! has {
201
- m .mutex .Unlock ()
201
+ m .rwmutex .Unlock ()
202
202
return false
203
203
}
204
204
delete (m .loggers , name )
205
205
m .internalResetLevel ()
206
- m .mutex .Unlock ()
206
+ m .rwmutex .Unlock ()
207
207
logger .Flush ()
208
208
logger .Close ()
209
209
return true
210
210
}
211
211
212
212
// GetEventLogger returns a sub logger from this MultiChannelledLog
213
213
func (m * MultiChannelledLog ) GetEventLogger (name string ) EventLogger {
214
- m .mutex . Lock ()
215
- defer m .mutex . Unlock ()
214
+ m .rwmutex . RLock ()
215
+ defer m .rwmutex . RUnlock ()
216
216
return m .loggers [name ]
217
217
}
218
218
219
219
// GetEventLoggerNames returns a list of names
220
220
func (m * MultiChannelledLog ) GetEventLoggerNames () []string {
221
- m .mutex . Lock ()
222
- defer m .mutex . Unlock ()
221
+ m .rwmutex . RLock ()
222
+ defer m .rwmutex . RUnlock ()
223
223
var keys []string
224
224
for k := range m .loggers {
225
225
keys = append (keys , k )
@@ -228,12 +228,12 @@ func (m *MultiChannelledLog) GetEventLoggerNames() []string {
228
228
}
229
229
230
230
func (m * MultiChannelledLog ) closeLoggers () {
231
- m .mutex .Lock ()
231
+ m .rwmutex .Lock ()
232
232
for _ , logger := range m .loggers {
233
233
logger .Flush ()
234
234
logger .Close ()
235
235
}
236
- m .mutex .Unlock ()
236
+ m .rwmutex .Unlock ()
237
237
m .closed <- true
238
238
}
239
239
@@ -249,8 +249,8 @@ func (m *MultiChannelledLog) Resume() {
249
249
250
250
// ReleaseReopen causes this logger to tell its subloggers to release and reopen
251
251
func (m * MultiChannelledLog ) ReleaseReopen () error {
252
- m .mutex .Lock ()
253
- defer m .mutex .Unlock ()
252
+ m .rwmutex .Lock ()
253
+ defer m .rwmutex .Unlock ()
254
254
var accumulatedErr error
255
255
for _ , logger := range m .loggers {
256
256
if err := logger .ReleaseReopen (); err != nil {
@@ -266,13 +266,13 @@ func (m *MultiChannelledLog) ReleaseReopen() error {
266
266
267
267
// Start processing the MultiChannelledLog
268
268
func (m * MultiChannelledLog ) Start () {
269
- m .mutex .Lock ()
269
+ m .rwmutex .Lock ()
270
270
if m .started {
271
- m .mutex .Unlock ()
271
+ m .rwmutex .Unlock ()
272
272
return
273
273
}
274
274
m .started = true
275
- m .mutex .Unlock ()
275
+ m .rwmutex .Unlock ()
276
276
paused := false
277
277
for {
278
278
if paused {
@@ -286,11 +286,11 @@ func (m *MultiChannelledLog) Start() {
286
286
m .closeLoggers ()
287
287
return
288
288
}
289
- m .mutex . Lock ()
289
+ m .rwmutex . RLock ()
290
290
for _ , logger := range m .loggers {
291
291
logger .Flush ()
292
292
}
293
- m .mutex . Unlock ()
293
+ m .rwmutex . RUnlock ()
294
294
case <- m .close :
295
295
m .closeLoggers ()
296
296
return
@@ -307,24 +307,24 @@ func (m *MultiChannelledLog) Start() {
307
307
m .closeLoggers ()
308
308
return
309
309
}
310
- m .mutex . Lock ()
310
+ m .rwmutex . RLock ()
311
311
for _ , logger := range m .loggers {
312
312
err := logger .LogEvent (event )
313
313
if err != nil {
314
314
fmt .Println (err )
315
315
}
316
316
}
317
- m .mutex . Unlock ()
317
+ m .rwmutex . RUnlock ()
318
318
case _ , ok := <- m .flush :
319
319
if ! ok {
320
320
m .closeLoggers ()
321
321
return
322
322
}
323
- m .mutex . Lock ()
323
+ m .rwmutex . RLock ()
324
324
for _ , logger := range m .loggers {
325
325
logger .Flush ()
326
326
}
327
- m .mutex . Unlock ()
327
+ m .rwmutex . RUnlock ()
328
328
case <- m .close :
329
329
m .closeLoggers ()
330
330
return
@@ -359,11 +359,15 @@ func (m *MultiChannelledLog) Flush() {
359
359
360
360
// GetLevel gets the level of this MultiChannelledLog
361
361
func (m * MultiChannelledLog ) GetLevel () Level {
362
+ m .rwmutex .RLock ()
363
+ defer m .rwmutex .RUnlock ()
362
364
return m .level
363
365
}
364
366
365
367
// GetStacktraceLevel gets the level of this MultiChannelledLog
366
368
func (m * MultiChannelledLog ) GetStacktraceLevel () Level {
369
+ m .rwmutex .RLock ()
370
+ defer m .rwmutex .RUnlock ()
367
371
return m .stacktraceLevel
368
372
}
369
373
@@ -384,8 +388,8 @@ func (m *MultiChannelledLog) internalResetLevel() Level {
384
388
385
389
// ResetLevel will reset the level of this MultiChannelledLog
386
390
func (m * MultiChannelledLog ) ResetLevel () Level {
387
- m .mutex .Lock ()
388
- defer m .mutex .Unlock ()
391
+ m .rwmutex .Lock ()
392
+ defer m .rwmutex .Unlock ()
389
393
return m .internalResetLevel ()
390
394
}
391
395
0 commit comments