8
8
"os"
9
9
"runtime"
10
10
"strings"
11
+ "sync"
11
12
)
12
13
13
14
var (
16
17
// NamedLoggers map of named loggers
17
18
NamedLoggers = make (map [string ]* Logger )
18
19
prefix string
20
+ mu sync.RWMutex
19
21
)
20
22
21
23
// NewLogger create a logger for the default logger
@@ -25,11 +27,17 @@ func NewLogger(bufLen int64, name, provider, config string) *Logger {
25
27
CriticalWithSkip (1 , "Unable to create default logger: %v" , err )
26
28
panic (err )
27
29
}
28
- return NamedLoggers [DEFAULT ]
30
+ mu .RLock ()
31
+ l := NamedLoggers [DEFAULT ]
32
+ mu .RUnlock ()
33
+ return l
29
34
}
30
35
31
36
// NewNamedLogger creates a new named logger for a given configuration
32
37
func NewNamedLogger (name string , bufLen int64 , subname , provider , config string ) error {
38
+ mu .Lock ()
39
+ defer mu .Unlock ()
40
+
33
41
logger , ok := NamedLoggers [name ]
34
42
if ! ok {
35
43
logger = newLogger (name , bufLen )
@@ -42,6 +50,9 @@ func NewNamedLogger(name string, bufLen int64, subname, provider, config string)
42
50
43
51
// DelNamedLogger closes and deletes the named logger
44
52
func DelNamedLogger (name string ) {
53
+ mu .Lock ()
54
+ defer mu .Unlock ()
55
+
45
56
l , ok := NamedLoggers [name ]
46
57
if ok {
47
58
delete (NamedLoggers , name )
@@ -51,7 +62,9 @@ func DelNamedLogger(name string) {
51
62
52
63
// DelLogger removes the named sublogger from the default logger
53
64
func DelLogger (name string ) error {
65
+ mu .RLock ()
54
66
logger := NamedLoggers [DEFAULT ]
67
+ mu .RUnlock ()
55
68
found , err := logger .DelLogger (name )
56
69
if ! found {
57
70
Trace ("Log %s not found, no need to delete" , name )
@@ -61,6 +74,9 @@ func DelLogger(name string) error {
61
74
62
75
// GetLogger returns either a named logger or the default logger
63
76
func GetLogger (name string ) * Logger {
77
+ mu .RLock ()
78
+ defer mu .RUnlock ()
79
+
64
80
logger , ok := NamedLoggers [name ]
65
81
if ok {
66
82
return logger
@@ -70,11 +86,15 @@ func GetLogger(name string) *Logger {
70
86
71
87
// GetLevel returns the minimum logger level
72
88
func GetLevel () Level {
89
+ mu .RLock ()
90
+ defer mu .RUnlock ()
73
91
return NamedLoggers [DEFAULT ].GetLevel ()
74
92
}
75
93
76
94
// GetStacktraceLevel returns the minimum logger level
77
95
func GetStacktraceLevel () Level {
96
+ mu .RLock ()
97
+ defer mu .RUnlock ()
78
98
return NamedLoggers [DEFAULT ].GetStacktraceLevel ()
79
99
}
80
100
@@ -169,6 +189,9 @@ func IsFatal() bool {
169
189
170
190
// Close closes all the loggers
171
191
func Close () {
192
+ mu .Lock ()
193
+ defer mu .Unlock ()
194
+
172
195
l , ok := NamedLoggers [DEFAULT ]
173
196
if ! ok {
174
197
return
@@ -180,6 +203,9 @@ func Close() {
180
203
// Log a message with defined skip and at logging level
181
204
// A skip of 0 refers to the caller of this command
182
205
func Log (skip int , level Level , format string , v ... interface {}) {
206
+ mu .RLock ()
207
+ defer mu .RUnlock ()
208
+
183
209
l , ok := NamedLoggers [DEFAULT ]
184
210
if ok {
185
211
l .Log (skip + 1 , level , format , v ... )
@@ -195,7 +221,9 @@ type LoggerAsWriter struct {
195
221
// NewLoggerAsWriter creates a Writer representation of the logger with setable log level
196
222
func NewLoggerAsWriter (level string , ourLoggers ... * Logger ) * LoggerAsWriter {
197
223
if len (ourLoggers ) == 0 {
224
+ mu .RLock ()
198
225
ourLoggers = []* Logger {NamedLoggers [DEFAULT ]}
226
+ mu .RUnlock ()
199
227
}
200
228
l := & LoggerAsWriter {
201
229
ourLoggers : ourLoggers ,
0 commit comments