@@ -143,7 +143,7 @@ type MultiChannelledLog struct {
143143 name string
144144 bufferLength int64
145145 queue chan * Event
146- mutex sync.Mutex
146+ rwmutex sync.RWMutex
147147 loggers map [string ]EventLogger
148148 flush chan bool
149149 close chan bool
@@ -173,10 +173,10 @@ func NewMultiChannelledLog(name string, bufferLength int64) *MultiChannelledLog
173173
174174// AddLogger adds a logger to this MultiChannelledLog
175175func (m * MultiChannelledLog ) AddLogger (logger EventLogger ) error {
176- m .mutex .Lock ()
176+ m .rwmutex .Lock ()
177177 name := logger .GetName ()
178178 if _ , has := m .loggers [name ]; has {
179- m .mutex .Unlock ()
179+ m .rwmutex .Unlock ()
180180 return ErrDuplicateName {name }
181181 }
182182 m .loggers [name ] = logger
@@ -186,7 +186,7 @@ func (m *MultiChannelledLog) AddLogger(logger EventLogger) error {
186186 if logger .GetStacktraceLevel () < m .stacktraceLevel {
187187 m .stacktraceLevel = logger .GetStacktraceLevel ()
188188 }
189- m .mutex .Unlock ()
189+ m .rwmutex .Unlock ()
190190 go m .Start ()
191191 return nil
192192}
@@ -195,31 +195,31 @@ func (m *MultiChannelledLog) AddLogger(logger EventLogger) error {
195195// NB: If you delete the last sublogger this logger will simply drop
196196// log events
197197func (m * MultiChannelledLog ) DelLogger (name string ) bool {
198- m .mutex .Lock ()
198+ m .rwmutex .Lock ()
199199 logger , has := m .loggers [name ]
200200 if ! has {
201- m .mutex .Unlock ()
201+ m .rwmutex .Unlock ()
202202 return false
203203 }
204204 delete (m .loggers , name )
205205 m .internalResetLevel ()
206- m .mutex .Unlock ()
206+ m .rwmutex .Unlock ()
207207 logger .Flush ()
208208 logger .Close ()
209209 return true
210210}
211211
212212// GetEventLogger returns a sub logger from this MultiChannelledLog
213213func (m * MultiChannelledLog ) GetEventLogger (name string ) EventLogger {
214- m .mutex . Lock ()
215- defer m .mutex . Unlock ()
214+ m .rwmutex . RLock ()
215+ defer m .rwmutex . RUnlock ()
216216 return m .loggers [name ]
217217}
218218
219219// GetEventLoggerNames returns a list of names
220220func (m * MultiChannelledLog ) GetEventLoggerNames () []string {
221- m .mutex . Lock ()
222- defer m .mutex . Unlock ()
221+ m .rwmutex . RLock ()
222+ defer m .rwmutex . RUnlock ()
223223 var keys []string
224224 for k := range m .loggers {
225225 keys = append (keys , k )
@@ -228,12 +228,12 @@ func (m *MultiChannelledLog) GetEventLoggerNames() []string {
228228}
229229
230230func (m * MultiChannelledLog ) closeLoggers () {
231- m .mutex .Lock ()
231+ m .rwmutex .Lock ()
232232 for _ , logger := range m .loggers {
233233 logger .Flush ()
234234 logger .Close ()
235235 }
236- m .mutex .Unlock ()
236+ m .rwmutex .Unlock ()
237237 m .closed <- true
238238}
239239
@@ -249,8 +249,8 @@ func (m *MultiChannelledLog) Resume() {
249249
250250// ReleaseReopen causes this logger to tell its subloggers to release and reopen
251251func (m * MultiChannelledLog ) ReleaseReopen () error {
252- m .mutex .Lock ()
253- defer m .mutex .Unlock ()
252+ m .rwmutex .Lock ()
253+ defer m .rwmutex .Unlock ()
254254 var accumulatedErr error
255255 for _ , logger := range m .loggers {
256256 if err := logger .ReleaseReopen (); err != nil {
@@ -266,13 +266,13 @@ func (m *MultiChannelledLog) ReleaseReopen() error {
266266
267267// Start processing the MultiChannelledLog
268268func (m * MultiChannelledLog ) Start () {
269- m .mutex .Lock ()
269+ m .rwmutex .Lock ()
270270 if m .started {
271- m .mutex .Unlock ()
271+ m .rwmutex .Unlock ()
272272 return
273273 }
274274 m .started = true
275- m .mutex .Unlock ()
275+ m .rwmutex .Unlock ()
276276 paused := false
277277 for {
278278 if paused {
@@ -286,11 +286,11 @@ func (m *MultiChannelledLog) Start() {
286286 m .closeLoggers ()
287287 return
288288 }
289- m .mutex . Lock ()
289+ m .rwmutex . RLock ()
290290 for _ , logger := range m .loggers {
291291 logger .Flush ()
292292 }
293- m .mutex . Unlock ()
293+ m .rwmutex . RUnlock ()
294294 case <- m .close :
295295 m .closeLoggers ()
296296 return
@@ -307,24 +307,24 @@ func (m *MultiChannelledLog) Start() {
307307 m .closeLoggers ()
308308 return
309309 }
310- m .mutex . Lock ()
310+ m .rwmutex . RLock ()
311311 for _ , logger := range m .loggers {
312312 err := logger .LogEvent (event )
313313 if err != nil {
314314 fmt .Println (err )
315315 }
316316 }
317- m .mutex . Unlock ()
317+ m .rwmutex . RUnlock ()
318318 case _ , ok := <- m .flush :
319319 if ! ok {
320320 m .closeLoggers ()
321321 return
322322 }
323- m .mutex . Lock ()
323+ m .rwmutex . RLock ()
324324 for _ , logger := range m .loggers {
325325 logger .Flush ()
326326 }
327- m .mutex . Unlock ()
327+ m .rwmutex . RUnlock ()
328328 case <- m .close :
329329 m .closeLoggers ()
330330 return
@@ -359,11 +359,15 @@ func (m *MultiChannelledLog) Flush() {
359359
360360// GetLevel gets the level of this MultiChannelledLog
361361func (m * MultiChannelledLog ) GetLevel () Level {
362+ m .rwmutex .RLock ()
363+ defer m .rwmutex .RUnlock ()
362364 return m .level
363365}
364366
365367// GetStacktraceLevel gets the level of this MultiChannelledLog
366368func (m * MultiChannelledLog ) GetStacktraceLevel () Level {
369+ m .rwmutex .RLock ()
370+ defer m .rwmutex .RUnlock ()
367371 return m .stacktraceLevel
368372}
369373
@@ -384,8 +388,8 @@ func (m *MultiChannelledLog) internalResetLevel() Level {
384388
385389// ResetLevel will reset the level of this MultiChannelledLog
386390func (m * MultiChannelledLog ) ResetLevel () Level {
387- m .mutex .Lock ()
388- defer m .mutex .Unlock ()
391+ m .rwmutex .Lock ()
392+ defer m .rwmutex .Unlock ()
389393 return m .internalResetLevel ()
390394}
391395
0 commit comments