@@ -12,6 +12,8 @@ import (
12
12
"runtime"
13
13
"strings"
14
14
"sync"
15
+
16
+ "golang.org/x/sync/syncmap"
15
17
)
16
18
17
19
var (
@@ -42,10 +44,11 @@ func NewLogger(bufLen int64, mode, config string) {
42
44
// DelLogger removes loggers that are for the given mode
43
45
func DelLogger (mode string ) error {
44
46
for _ , l := range loggers {
45
- if _ , ok := l .outputs [ mode ] ; ok {
47
+ if _ , ok := l .outputs . Load ( mode ) ; ok {
46
48
return l .DelLogger (mode )
47
49
}
48
50
}
51
+
49
52
Trace ("Log adapter %s not found, no need to delete" , mode )
50
53
return nil
51
54
}
@@ -177,31 +180,28 @@ type Logger struct {
177
180
lock sync.Mutex
178
181
level int
179
182
msg chan * logMsg
180
- outputs map [ string ] LoggerInterface
183
+ outputs syncmap. Map
181
184
quit chan bool
182
185
}
183
186
184
187
// newLogger initializes and returns a new logger.
185
188
func newLogger (buffer int64 ) * Logger {
186
189
l := & Logger {
187
- msg : make (chan * logMsg , buffer ),
188
- outputs : make (map [string ]LoggerInterface ),
189
- quit : make (chan bool ),
190
+ msg : make (chan * logMsg , buffer ),
191
+ quit : make (chan bool ),
190
192
}
191
193
go l .StartLogger ()
192
194
return l
193
195
}
194
196
195
197
// SetLogger sets new logger instance with given logger adapter and config.
196
198
func (l * Logger ) SetLogger (adapter string , config string ) error {
197
- l .lock .Lock ()
198
- defer l .lock .Unlock ()
199
199
if log , ok := adapters [adapter ]; ok {
200
200
lg := log ()
201
201
if err := lg .Init (config ); err != nil {
202
202
return err
203
203
}
204
- l .outputs [ adapter ] = lg
204
+ l .outputs . Store ( adapter , lg )
205
205
l .adapter = adapter
206
206
} else {
207
207
panic ("log: unknown adapter \" " + adapter + "\" (forgotten register?)" )
@@ -211,11 +211,9 @@ func (l *Logger) SetLogger(adapter string, config string) error {
211
211
212
212
// DelLogger removes a logger adapter instance.
213
213
func (l * Logger ) DelLogger (adapter string ) error {
214
- l .lock .Lock ()
215
- defer l .lock .Unlock ()
216
- if lg , ok := l .outputs [adapter ]; ok {
217
- lg .Destroy ()
218
- delete (l .outputs , adapter )
214
+ if lg , ok := l .outputs .Load (adapter ); ok {
215
+ lg .(LoggerInterface ).Destroy ()
216
+ l .outputs .Delete (adapter )
219
217
} else {
220
218
panic ("log: unknown adapter \" " + adapter + "\" (forgotten register?)" )
221
219
}
@@ -264,11 +262,12 @@ func (l *Logger) StartLogger() {
264
262
for {
265
263
select {
266
264
case bm := <- l .msg :
267
- for _ , l := range l . outputs {
268
- if err := l .WriteMsg (bm .msg , bm .skip , bm .level ); err != nil {
265
+ l . outputs . Range ( func ( k , v interface {}) bool {
266
+ if err := v .( LoggerInterface ) .WriteMsg (bm .msg , bm .skip , bm .level ); err != nil {
269
267
fmt .Println ("ERROR, unable to WriteMsg:" , err )
270
268
}
271
- }
269
+ return true
270
+ })
272
271
case <- l .quit :
273
272
return
274
273
}
@@ -277,9 +276,10 @@ func (l *Logger) StartLogger() {
277
276
278
277
// Flush flushes all chan data.
279
278
func (l * Logger ) Flush () {
280
- for _ , l := range l .outputs {
281
- l .Flush ()
282
- }
279
+ l .outputs .Range (func (k , v interface {}) bool {
280
+ v .(LoggerInterface ).Flush ()
281
+ return true
282
+ })
283
283
}
284
284
285
285
// Close closes logger, flush all chan data and destroy all adapter instances.
@@ -288,19 +288,21 @@ func (l *Logger) Close() {
288
288
for {
289
289
if len (l .msg ) > 0 {
290
290
bm := <- l .msg
291
- for _ , l := range l . outputs {
292
- if err := l .WriteMsg (bm .msg , bm .skip , bm .level ); err != nil {
291
+ l . outputs . Range ( func ( k , v interface {}) bool {
292
+ if err := v .( LoggerInterface ) .WriteMsg (bm .msg , bm .skip , bm .level ); err != nil {
293
293
fmt .Println ("ERROR, unable to WriteMsg:" , err )
294
294
}
295
- }
295
+ return true
296
+ })
296
297
} else {
297
298
break
298
299
}
299
300
}
300
- for _ , l := range l .outputs {
301
- l .Flush ()
302
- l .Destroy ()
303
- }
301
+ l .outputs .Range (func (k , v interface {}) bool {
302
+ v .(LoggerInterface ).Flush ()
303
+ v .(LoggerInterface ).Destroy ()
304
+ return true
305
+ })
304
306
}
305
307
306
308
// Trace records trace log
0 commit comments