From 7c41e041f1cf373f77b351eca813aa7a98db1b2a Mon Sep 17 00:00:00 2001 From: lovung Date: Thu, 25 Jan 2024 21:58:00 +0800 Subject: [PATCH] feat: add zerolog (#46) - remove unnecessary code, expose ExtraKey --- logging/zerolog/README.md | 27 +++++++++++++++++++++++++++ logging/zerolog/logger.go | 26 ++++++++++++-------------- logging/zerolog/option.go | 6 ------ logging/zerolog/option_test.go | 29 ----------------------------- 4 files changed, 39 insertions(+), 49 deletions(-) create mode 100644 logging/zerolog/README.md delete mode 100644 logging/zerolog/option_test.go diff --git a/logging/zerolog/README.md b/logging/zerolog/README.md new file mode 100644 index 0000000..53b231a --- /dev/null +++ b/logging/zerolog/README.md @@ -0,0 +1,27 @@ +# Notes +- If you're using the global logger in `github.com/rs/zerolog/log.Logger` to do log. You should add the middleware to pass the OTEL extra information (key, value) into the `context.Context`. +- Example: +```go +import ( + "context" + "time" + + "github.com/cloudwego/hertz/pkg/app" + "github.com/rs/zerolog/log" + "go.opentelemetry.io/otel/trace" + "github.com/hertz-contrib/obs-opentelemetry/logging/zerolog" +) + +func OtelZerologMiddleware() app.HandlerFunc { + return func(ctx context.Context, reqCtx *app.RequestContext) { + ctx = log.Logger.WithContext(ctx) + + span := trace.SpanFromContext(ctx) + + ctx = context.WithValue(ctx, zerolog.ExtraKey(zerolog.TraceIDKey), span.SpanContext().TraceID()) + ctx = context.WithValue(ctx, zerolog.ExtraKey(zerolog.SpanIDKey), span.SpanContext().SpanID()) + ctx = context.WithValue(ctx, zerolog.ExtraKey(zerolog.TraceFlagsKey), span.SpanContext().TraceFlags()) + + reqCtx.Next(ctx) + } +``` diff --git a/logging/zerolog/logger.go b/logging/zerolog/logger.go index c47accd..cb99eb2 100644 --- a/logging/zerolog/logger.go +++ b/logging/zerolog/logger.go @@ -32,15 +32,13 @@ type Logger struct { // Ref to https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/README.md#json-formats const ( - traceIDKey = "trace_id" - spanIDKey = "span_id" - traceFlagsKey = "trace_flags" + TraceIDKey = "trace_id" + SpanIDKey = "span_id" + TraceFlagsKey = "trace_flags" ) type ExtraKey string -var extraKeys = []ExtraKey{traceIDKey, spanIDKey, traceFlagsKey} - func NewLogger(opts ...Option) *Logger { config := defaultConfig() @@ -49,15 +47,15 @@ func NewLogger(opts ...Option) *Logger { opt.apply(config) } logger := *config.logger - logger.Unwrap().Hook(zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, message string) { + newLogger := hertzzerolog.From(logger.Unwrap().Hook(zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, message string) { ctx := e.GetCtx() - e.Any(traceIDKey, ctx.Value(ExtraKey(traceIDKey))) - e.Any(spanIDKey, ctx.Value(ExtraKey(spanIDKey))) - e.Any(traceFlagsKey, ctx.Value(ExtraKey(traceFlagsKey))) - })) + e.Any(TraceIDKey, ctx.Value(ExtraKey(TraceIDKey))) + e.Any(SpanIDKey, ctx.Value(ExtraKey(SpanIDKey))) + e.Any(TraceFlagsKey, ctx.Value(ExtraKey(TraceFlagsKey))) + }))) return &Logger{ - Logger: logger, + Logger: *newLogger, config: config, } } @@ -66,9 +64,9 @@ func (l *Logger) CtxLogf(level hlog.Level, ctx context.Context, format string, k var zlevel zerolog.Level span := trace.SpanFromContext(ctx) - ctx = context.WithValue(ctx, ExtraKey(traceIDKey), span.SpanContext().TraceID()) - ctx = context.WithValue(ctx, ExtraKey(spanIDKey), span.SpanContext().SpanID()) - ctx = context.WithValue(ctx, ExtraKey(traceFlagsKey), span.SpanContext().TraceFlags()) + ctx = context.WithValue(ctx, ExtraKey(TraceIDKey), span.SpanContext().TraceID()) + ctx = context.WithValue(ctx, ExtraKey(SpanIDKey), span.SpanContext().SpanID()) + ctx = context.WithValue(ctx, ExtraKey(TraceFlagsKey), span.SpanContext().TraceFlags()) switch level { case hlog.LevelDebug, hlog.LevelTrace: diff --git a/logging/zerolog/option.go b/logging/zerolog/option.go index 1e15af6..9bd8e39 100644 --- a/logging/zerolog/option.go +++ b/logging/zerolog/option.go @@ -53,12 +53,6 @@ func defaultConfig() *config { // WithLogger configures logger func WithLogger(logger *hertzzerolog.Logger) Option { return option(func(cfg *config) { - logger.Unwrap().Hook(zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, message string) { - ctx := e.GetCtx() - e.Any(traceIDKey, ctx.Value(ExtraKey(traceIDKey))) - e.Any(spanIDKey, ctx.Value(ExtraKey(spanIDKey))) - e.Any(traceFlagsKey, ctx.Value(ExtraKey(traceFlagsKey))) - })) cfg.logger = logger }) } diff --git a/logging/zerolog/option_test.go b/logging/zerolog/option_test.go deleted file mode 100644 index f618dcb..0000000 --- a/logging/zerolog/option_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2022 CloudWeGo Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zerolog - -import ( - "testing" - - hertzzerolog "github.com/hertz-contrib/logger/zerolog" - "github.com/stretchr/testify/assert" -) - -func TestWithLogger(t *testing.T) { - l := NewLogger(WithLogger(hertzzerolog.New())) - for _, v := range extraKeys { - assert.Contains(t, l.GetExtraKeys(), v) - } -}