package grpc import ( "context" "fmt" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "go.uber.org/zap" ) func ZapLogInterceptor() 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)) default: f = append(f, zap.Any(key.(string), v)) } } log := logger.WithOptions(zap.AddCallerSkip(1)).With(f...) switch lvl { case logging.LevelDebug: log.Debug(msg) case logging.LevelInfo: log.Info(msg) case logging.LevelWarn: log.Warn(msg) case logging.LevelError: log.Error(msg) default: panic(fmt.Sprintf("unknown level %v", lvl)) } }) }