Skip to content

Commit 58186f3

Browse files
committed
Fix data race in modules/log
1 parent bd9dcdb commit 58186f3

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

modules/log/log.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"os"
99
"runtime"
1010
"strings"
11+
"sync"
1112
)
1213

1314
var (
@@ -16,6 +17,7 @@ var (
1617
// NamedLoggers map of named loggers
1718
NamedLoggers = make(map[string]*Logger)
1819
prefix string
20+
mu sync.RWMutex
1921
)
2022

2123
// NewLogger create a logger for the default logger
@@ -25,11 +27,17 @@ func NewLogger(bufLen int64, name, provider, config string) *Logger {
2527
CriticalWithSkip(1, "Unable to create default logger: %v", err)
2628
panic(err)
2729
}
28-
return NamedLoggers[DEFAULT]
30+
mu.RLock()
31+
l := NamedLoggers[DEFAULT]
32+
mu.RUnlock()
33+
return l
2934
}
3035

3136
// NewNamedLogger creates a new named logger for a given configuration
3237
func NewNamedLogger(name string, bufLen int64, subname, provider, config string) error {
38+
mu.Lock()
39+
defer mu.Unlock()
40+
3341
logger, ok := NamedLoggers[name]
3442
if !ok {
3543
logger = newLogger(name, bufLen)
@@ -42,6 +50,9 @@ func NewNamedLogger(name string, bufLen int64, subname, provider, config string)
4250

4351
// DelNamedLogger closes and deletes the named logger
4452
func DelNamedLogger(name string) {
53+
mu.Lock()
54+
defer mu.Unlock()
55+
4556
l, ok := NamedLoggers[name]
4657
if ok {
4758
delete(NamedLoggers, name)
@@ -51,7 +62,9 @@ func DelNamedLogger(name string) {
5162

5263
// DelLogger removes the named sublogger from the default logger
5364
func DelLogger(name string) error {
65+
mu.RLock()
5466
logger := NamedLoggers[DEFAULT]
67+
mu.RUnlock()
5568
found, err := logger.DelLogger(name)
5669
if !found {
5770
Trace("Log %s not found, no need to delete", name)
@@ -61,6 +74,9 @@ func DelLogger(name string) error {
6174

6275
// GetLogger returns either a named logger or the default logger
6376
func GetLogger(name string) *Logger {
77+
mu.RLock()
78+
defer mu.RUnlock()
79+
6480
logger, ok := NamedLoggers[name]
6581
if ok {
6682
return logger
@@ -70,11 +86,15 @@ func GetLogger(name string) *Logger {
7086

7187
// GetLevel returns the minimum logger level
7288
func GetLevel() Level {
89+
mu.RLock()
90+
defer mu.RUnlock()
7391
return NamedLoggers[DEFAULT].GetLevel()
7492
}
7593

7694
// GetStacktraceLevel returns the minimum logger level
7795
func GetStacktraceLevel() Level {
96+
mu.RLock()
97+
defer mu.RUnlock()
7898
return NamedLoggers[DEFAULT].GetStacktraceLevel()
7999
}
80100

@@ -169,6 +189,9 @@ func IsFatal() bool {
169189

170190
// Close closes all the loggers
171191
func Close() {
192+
mu.Lock()
193+
defer mu.Unlock()
194+
172195
l, ok := NamedLoggers[DEFAULT]
173196
if !ok {
174197
return
@@ -180,6 +203,9 @@ func Close() {
180203
// Log a message with defined skip and at logging level
181204
// A skip of 0 refers to the caller of this command
182205
func Log(skip int, level Level, format string, v ...interface{}) {
206+
mu.RLock()
207+
defer mu.RUnlock()
208+
183209
l, ok := NamedLoggers[DEFAULT]
184210
if ok {
185211
l.Log(skip+1, level, format, v...)
@@ -195,7 +221,9 @@ type LoggerAsWriter struct {
195221
// NewLoggerAsWriter creates a Writer representation of the logger with setable log level
196222
func NewLoggerAsWriter(level string, ourLoggers ...*Logger) *LoggerAsWriter {
197223
if len(ourLoggers) == 0 {
224+
mu.RLock()
198225
ourLoggers = []*Logger{NamedLoggers[DEFAULT]}
226+
mu.RUnlock()
199227
}
200228
l := &LoggerAsWriter{
201229
ourLoggers: ourLoggers,

0 commit comments

Comments
 (0)