Skip to content

Commit 201e747

Browse files
authored
Merge pull request kubernetes-sigs#1093 from vincepri/log-from-context
✨ Add ability to set/get logger in/from a context.Context
2 parents 8734ac8 + 6436207 commit 201e747

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

alias.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ var (
125125
// get any actual logging.
126126
Log = log.Log
127127

128+
// LoggerFromContext returns a logger with predefined values from a context.Context.
129+
//
130+
// This is meant to be used with the context supplied in a struct that satisfies the Reconciler interface.
131+
LoggerFromContext = log.FromContext
132+
128133
// SetLogger sets a concrete logging implementation for all deferred Loggers.
129134
SetLogger = log.SetLogger
130135
)

pkg/log/log.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,15 @@ limitations under the License.
3434
package log
3535

3636
import (
37+
"context"
38+
3739
"github.com/go-logr/logr"
3840
)
3941

42+
var (
43+
contextKey = &struct{}{}
44+
)
45+
4046
// SetLogger sets a concrete logging implementation for all deferred Loggers.
4147
func SetLogger(l logr.Logger) {
4248
Log.Fulfill(l)
@@ -46,3 +52,22 @@ func SetLogger(l logr.Logger) {
4652
// to another logr.Logger. You *must* call SetLogger to
4753
// get any actual logging.
4854
var Log = NewDelegatingLogger(NullLogger{})
55+
56+
// FromContext returns a logger with predefined values from a context.Context.
57+
func FromContext(ctx context.Context, keysAndValues ...interface{}) logr.Logger {
58+
var log logr.Logger
59+
if ctx == nil {
60+
log = Log
61+
} else {
62+
lv := ctx.Value(contextKey)
63+
log = lv.(logr.Logger)
64+
}
65+
log.WithValues(keysAndValues...)
66+
return log
67+
}
68+
69+
// IntoContext takes a context and sets the logger as one of its keys.
70+
// Use FromContext function to retrieve the logger.
71+
func IntoContext(ctx context.Context, log logr.Logger) context.Context {
72+
return context.WithValue(ctx, contextKey, log)
73+
}

0 commit comments

Comments
 (0)