package log import ( "context" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "github.com/spechtlabs/go-otel-utils/otelzap" "go.uber.org/zap" ) // InterceptorLogger adapts zap logger to interceptor logger. // This code is simple enough to be copied and not imported. func InterceptorLogger(l *otelzap.Logger) logging.Logger { return logging.LoggerFunc(func(ctx context.Context, lvl logging.Level, msg string, fields ...any) { f := make([]zap.Field, 0, len(fields)/2) for i := 0; i < len(fields); i += 2 { key := fields[i] value := fields[i+1] switch v := value.(type) { case string: f = append(f, zap.String(key.(string), v)) case int: f = append(f, zap.Int(key.(string), v)) case bool: f = append(f, zap.Bool(key.(string), v)) case zap.Field: f = append(f, v) default: f = append(f, zap.Any(key.(string), v)) } } logger := l.WithOptions(zap.AddCallerSkip(4)).With(f...) switch lvl { case logging.LevelDebug: logger.Debug(msg) case logging.LevelInfo: logger.Info(msg) case logging.LevelWarn: logger.Warn(msg) case logging.LevelError: logger.Error(msg) default: logger.Warn(msg, zap.String("error", "unknown level"), zap.Int("level", int(lvl))) } }) }