|
1 | 1 | package logger |
2 | 2 |
|
3 | | -import "log" |
| 3 | +import ( |
| 4 | + "log" |
| 5 | + "sync" |
| 6 | +) |
4 | 7 |
|
5 | 8 | var ( |
| 9 | + _mu sync.RWMutex |
6 | 10 | _level = LevelInfo |
7 | 11 | _logger Logger = simpleLogger{} |
8 | 12 | ) |
@@ -36,55 +40,73 @@ type Level int8 |
36 | 40 | // SetLevel set global RSocket log level. |
37 | 41 | // Available levels are `LevelDebug`, `LevelInfo`, `LevelWarn` and `LevelError`. |
38 | 42 | func SetLevel(level Level) { |
| 43 | + _mu.Lock() |
| 44 | + defer _mu.Unlock() |
39 | 45 | _level = level |
40 | 46 | } |
41 | 47 |
|
42 | 48 | // SetLogger customize the global logger. |
43 | 49 | // A standard log implementation will be used by default. |
44 | 50 | func SetLogger(logger Logger) { |
| 51 | + _mu.Lock() |
| 52 | + defer _mu.Unlock() |
45 | 53 | _logger = logger |
46 | 54 | } |
47 | 55 |
|
48 | 56 | // GetLevel returns current logger level. |
49 | 57 | func GetLevel() Level { |
| 58 | + _mu.RLock() |
| 59 | + defer _mu.RUnlock() |
50 | 60 | return _level |
51 | 61 | } |
52 | 62 |
|
53 | 63 | // IsDebugEnabled returns true if debug level is open. |
54 | 64 | func IsDebugEnabled() bool { |
| 65 | + _mu.RLock() |
| 66 | + defer _mu.RUnlock() |
55 | 67 | return _level <= LevelDebug |
56 | 68 | } |
57 | 69 |
|
58 | 70 | // Debugf prints debug level log. |
59 | 71 | func Debugf(format string, args ...interface{}) { |
60 | | - if _logger == nil || _level > LevelDebug { |
| 72 | + logger, level := getLoggerAndLevel() |
| 73 | + if logger == nil || level > LevelDebug { |
61 | 74 | return |
62 | 75 | } |
63 | | - _logger.Debugf(format, args...) |
| 76 | + logger.Debugf(format, args...) |
64 | 77 | } |
65 | 78 |
|
66 | 79 | // Infof prints info level log. |
67 | 80 | func Infof(format string, args ...interface{}) { |
68 | | - if _logger == nil || _level > LevelInfo { |
| 81 | + logger, level := getLoggerAndLevel() |
| 82 | + if logger == nil || level > LevelInfo { |
69 | 83 | return |
70 | 84 | } |
71 | | - _logger.Infof(format, args...) |
| 85 | + logger.Infof(format, args...) |
72 | 86 | } |
73 | 87 |
|
74 | 88 | // Warnf prints warn level log. |
75 | 89 | func Warnf(format string, args ...interface{}) { |
76 | | - if _logger == nil || _level > LevelWarn { |
| 90 | + logger, level := getLoggerAndLevel() |
| 91 | + if logger == nil || level > LevelWarn { |
77 | 92 | return |
78 | 93 | } |
79 | | - _logger.Warnf(format, args...) |
| 94 | + logger.Warnf(format, args...) |
80 | 95 | } |
81 | 96 |
|
82 | 97 | // Errorf prints error level log. |
83 | 98 | func Errorf(format string, args ...interface{}) { |
84 | | - if _logger == nil || _level > LevelError { |
| 99 | + logger, level := getLoggerAndLevel() |
| 100 | + if logger == nil || level > LevelError { |
85 | 101 | return |
86 | 102 | } |
87 | | - _logger.Errorf(format, args...) |
| 103 | + logger.Errorf(format, args...) |
| 104 | +} |
| 105 | + |
| 106 | +func getLoggerAndLevel() (Logger, Level) { |
| 107 | + _mu.RLock() |
| 108 | + defer _mu.RUnlock() |
| 109 | + return _logger, _level |
88 | 110 | } |
89 | 111 |
|
90 | 112 | type simpleLogger struct { |
|
0 commit comments