From 27a4fc2eca3af8ff479a917a78cdd52a0034e175 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sun, 26 Nov 2023 04:11:57 -0700 Subject: [PATCH] Add draft logr interoperability methods --- logr-context/go.mod | 8 ++++++++ logr-context/go.sum | 4 ++++ logr-context/logr.go | 48 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 logr-context/go.mod create mode 100644 logr-context/go.sum create mode 100644 logr-context/logr.go diff --git a/logr-context/go.mod b/logr-context/go.mod new file mode 100644 index 0000000..5e35bf6 --- /dev/null +++ b/logr-context/go.mod @@ -0,0 +1,8 @@ +module github.com/veqryn/slog-context/logr-context + +go 1.21 + +require ( + github.com/go-logr/logr v1.3.0 + github.com/veqryn/slog-context v0.3.1-0.20231126110827-74878698ea2b +) diff --git a/logr-context/go.sum b/logr-context/go.sum new file mode 100644 index 0000000..1547784 --- /dev/null +++ b/logr-context/go.sum @@ -0,0 +1,4 @@ +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/veqryn/slog-context v0.3.1-0.20231126110827-74878698ea2b h1:BG6I67Hp571eSmcc3s8O0XAxSAUg3WHSiWPoMzeV91E= +github.com/veqryn/slog-context v0.3.1-0.20231126110827-74878698ea2b/go.mod h1:2IEM+uLEBRZyq+CRMdpETc13tUj9aA7zFZnm6/YnvPQ= diff --git a/logr-context/logr.go b/logr-context/logr.go new file mode 100644 index 0000000..4c5efb1 --- /dev/null +++ b/logr-context/logr.go @@ -0,0 +1,48 @@ +package logrcontext + +import ( + "context" + "log/slog" + + "github.com/go-logr/logr" + "github.com/go-logr/logr/slogr" + "github.com/veqryn/slog-context/internal" +) + +func LogrToCtx(parent context.Context, logger logr.Logger) context.Context { + if parent == nil { + parent = context.Background() + } + return context.WithValue(parent, internal.CtxKey{}, internal.LoggerCtxVal{ + Logger: slog.New(slogr.NewSlogHandler(logger)), + IterOp: logger, + }) +} + +func SlogToCtx(parent context.Context, logger *slog.Logger) context.Context { + if parent == nil { + parent = context.Background() + } + if logger == nil { + return context.WithValue(parent, internal.CtxKey{}, internal.LoggerCtxVal{Logger: logger}) + } + return context.WithValue(parent, internal.CtxKey{}, internal.LoggerCtxVal{ + Logger: logger, + IterOp: slogr.NewLogr(logger.Handler()), + }) +} + +func LogrFromCtx(ctx context.Context) logr.Logger { + if ctx == nil { + return slogr.NewLogr(slog.Default().Handler()) + } + if l, ok := ctx.Value(internal.CtxKey{}).(internal.LoggerCtxVal); ok { + if lgr, hasLogr := l.IterOp.(logr.Logger); hasLogr { + return lgr + } + if l.Logger != nil { + return slogr.NewLogr(l.Logger.Handler()) + } + } + return slogr.NewLogr(slog.Default().Handler()) +}