package grpc import ( "context" grpclogging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) // A grpc logging middleware compatible logger // implementation using a zerolog logger, either from // the global logger or a context logger type GRPCLogger struct { logger zerolog.Logger } // Returns a grpcLogger using the global zerolog Logger func NewGRPCLogger() *GRPCLogger { return &GRPCLogger{logger: log.Logger} } // Returns a grpcLogger using the zerolog logger in the provided context func NewGRPCContextLogger(ctx context.Context) *GRPCLogger { logger := log.Ctx(ctx) return &GRPCLogger{logger: *logger} } // Log logs the fields for given log level. We can assume users (middleware library) will put fields in pairs and // those will be unique. func (l *GRPCLogger) Log(ctx context.Context, level grpclogging.Level, msg string, fields ...any) { var event *zerolog.Event switch level { case grpclogging.LevelDebug: event = l.logger.Debug() case grpclogging.LevelInfo: event = l.logger.Info() case grpclogging.LevelWarn: event = l.logger.Warn() case grpclogging.LevelError: event = l.logger.Error() default: event = l.logger.Warn(). Int("unknowngrpcloglevel", int(level)) } event.Ctx(ctx) event.Fields(fields) event.Msg(msg) }