@@ -17,7 +17,8 @@ package global // import "go.opentelemetry.io/otel/internal/global"
17
17
import (
18
18
"log"
19
19
"os"
20
- "sync"
20
+ "sync/atomic"
21
+ "unsafe"
21
22
22
23
"github.com/go-logr/logr"
23
24
"github.com/go-logr/stdr"
@@ -27,37 +28,36 @@ import (
27
28
//
28
29
// The default logger uses stdr which is backed by the standard `log.Logger`
29
30
// interface. This logger will only show messages at the Error Level.
30
- var globalLogger logr.Logger = stdr .New (log .New (os .Stderr , "" , log .LstdFlags | log .Lshortfile ))
31
- var globalLoggerLock = & sync.RWMutex {}
31
+ var globalLogger unsafe.Pointer
32
+
33
+ func init () {
34
+ SetLogger (stdr .New (log .New (os .Stderr , "" , log .LstdFlags | log .Lshortfile )))
35
+ }
32
36
33
37
// SetLogger overrides the globalLogger with l.
34
38
//
35
39
// To see Info messages use a logger with `l.V(1).Enabled() == true`
36
40
// To see Debug messages use a logger with `l.V(5).Enabled() == true`.
37
41
func SetLogger (l logr.Logger ) {
38
- globalLoggerLock .Lock ()
39
- defer globalLoggerLock .Unlock ()
40
- globalLogger = l
42
+ atomic .StorePointer (& globalLogger , unsafe .Pointer (& l ))
43
+ }
44
+
45
+ func getLogger () logr.Logger {
46
+ return * (* logr .Logger )(atomic .LoadPointer (& globalLogger ))
41
47
}
42
48
43
49
// Info prints messages about the general state of the API or SDK.
44
50
// This should usually be less then 5 messages a minute.
45
51
func Info (msg string , keysAndValues ... interface {}) {
46
- globalLoggerLock .RLock ()
47
- defer globalLoggerLock .RUnlock ()
48
- globalLogger .V (1 ).Info (msg , keysAndValues ... )
52
+ getLogger ().V (1 ).Info (msg , keysAndValues ... )
49
53
}
50
54
51
55
// Error prints messages about exceptional states of the API or SDK.
52
56
func Error (err error , msg string , keysAndValues ... interface {}) {
53
- globalLoggerLock .RLock ()
54
- defer globalLoggerLock .RUnlock ()
55
- globalLogger .Error (err , msg , keysAndValues ... )
57
+ getLogger ().Error (err , msg , keysAndValues ... )
56
58
}
57
59
58
60
// Debug prints messages about all internal changes in the API or SDK.
59
61
func Debug (msg string , keysAndValues ... interface {}) {
60
- globalLoggerLock .RLock ()
61
- defer globalLoggerLock .RUnlock ()
62
- globalLogger .V (5 ).Info (msg , keysAndValues ... )
62
+ getLogger ().V (5 ).Info (msg , keysAndValues ... )
63
63
}
0 commit comments