diff --git a/logging/zap/doc.go b/logging/zap/doc.go index 570f97bcd..67131abeb 100644 --- a/logging/zap/doc.go +++ b/logging/zap/doc.go @@ -15,7 +15,7 @@ logged as structured `jsonpb` fields for every message received/sent (both unary `Payload*Interceptor` functions for that. Please note that the user-provided function that determines whetether to log the full request/response payload needs to be written with care, this can significantly slow down gRPC. -ZAP can also be made as a backend for gRPC library internals. For that use `ReplaceGrpcLogger`. +ZAP can also be made as a backend for gRPC library internals. For that use `ReplaceGrpcLoggerV2`. *Server Interceptor* diff --git a/logging/zap/examples_test.go b/logging/zap/examples_test.go index 264192bf2..8518b389b 100644 --- a/logging/zap/examples_test.go +++ b/logging/zap/examples_test.go @@ -4,10 +4,10 @@ import ( "context" "time" - "github.com/grpc-ecosystem/go-grpc-middleware" - "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" - "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/grpc-ecosystem/go-grpc-middleware/tags/zap" + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" + grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + ctx_zap "github.com/grpc-ecosystem/go-grpc-middleware/tags/zap" pb_testproto "github.com/grpc-ecosystem/go-grpc-middleware/testing/testproto" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -26,7 +26,7 @@ func Example_initialization() { grpc_zap.WithLevels(customFunc), } // Make sure that log statements internal to gRPC library are logged using the zapLogger as well. - grpc_zap.ReplaceGrpcLogger(zapLogger) + grpc_zap.ReplaceGrpcLoggerV2(zapLogger) // Create a server, make sure we put the grpc_ctxtags context before everything else. _ = grpc.NewServer( grpc_middleware.WithUnaryServerChain( diff --git a/logging/zap/grpclogger.go b/logging/zap/grpclogger.go index a8469c9d2..c3fafcc19 100644 --- a/logging/zap/grpclogger.go +++ b/logging/zap/grpclogger.go @@ -12,6 +12,7 @@ import ( // ReplaceGrpcLogger sets the given zap.Logger as a gRPC-level logger. // This should be called *before* any other initialization, preferably from init() functions. +// Deprecated: use ReplaceGrpcLoggerV2. func ReplaceGrpcLogger(logger *zap.Logger) { zgl := &zapGrpcLogger{logger.With(SystemField, zap.Bool("grpc_log", true))} grpclog.SetLogger(zgl) @@ -44,3 +45,74 @@ func (l *zapGrpcLogger) Printf(format string, args ...interface{}) { func (l *zapGrpcLogger) Println(args ...interface{}) { l.logger.Info(fmt.Sprint(args...)) } + +// ReplaceGrpcLoggerV2 replaces the grpc_log.LoggerV2 with the provided logger. +func ReplaceGrpcLoggerV2(logger *zap.Logger) { + ReplaceGrpcLoggerV2WithVerbosity(logger, 0) +} + +// ReplaceGrpcLoggerV2WithVerbosity replaces the grpc_.LoggerV2 with the provided logger and verbosity. +func ReplaceGrpcLoggerV2WithVerbosity(logger *zap.Logger, verbosity int) { + zgl := &zapGrpcLoggerV2{ + logger: logger.With(SystemField, zap.Bool("grpc_log", true)), + verbosity: verbosity, + } + grpclog.SetLoggerV2(zgl) +} + +type zapGrpcLoggerV2 struct { + logger *zap.Logger + verbosity int +} + +func (l *zapGrpcLoggerV2) Info(args ...interface{}) { + l.logger.Info(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Infoln(args ...interface{}) { + l.logger.Info(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Infof(format string, args ...interface{}) { + l.logger.Info(fmt.Sprintf(format, args...)) +} + +func (l *zapGrpcLoggerV2) Warning(args ...interface{}) { + l.logger.Warn(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Warningln(args ...interface{}) { + l.logger.Warn(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Warningf(format string, args ...interface{}) { + l.logger.Warn(fmt.Sprintf(format, args...)) +} + +func (l *zapGrpcLoggerV2) Error(args ...interface{}) { + l.logger.Error(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Errorln(args ...interface{}) { + l.logger.Error(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Errorf(format string, args ...interface{}) { + l.logger.Error(fmt.Sprintf(format, args...)) +} + +func (l *zapGrpcLoggerV2) Fatal(args ...interface{}) { + l.logger.Fatal(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Fatalln(args ...interface{}) { + l.logger.Fatal(fmt.Sprint(args...)) +} + +func (l *zapGrpcLoggerV2) Fatalf(format string, args ...interface{}) { + l.logger.Fatal(fmt.Sprintf(format, args...)) +} + +func (l *zapGrpcLoggerV2) V(level int) bool { + return level <= l.verbosity +}