package grpc_logsettable import ( "io/ioutil" "sync" "google.golang.org/grpc/grpclog" ) // SettableLoggerV2 is thread-safe. type SettableLoggerV2 interface { grpclog.LoggerV2 // Sets given logger as the underlying implementation. Set(loggerv2 grpclog.LoggerV2) // Sets `discard` logger as the underlying implementation. Reset() } // ReplaceGrpcLoggerV2 creates and configures SettableLoggerV2 as grpc logger. func ReplaceGrpcLoggerV2() SettableLoggerV2 { settable := &settableLoggerV2{} settable.Reset() grpclog.SetLoggerV2(settable) return settable } // SettableLoggerV2 implements SettableLoggerV2 type settableLoggerV2 struct { log grpclog.LoggerV2 mu sync.RWMutex } func (s *settableLoggerV2) Set(log grpclog.LoggerV2) { s.mu.Lock() defer s.mu.Unlock() s.log = log } func (s *settableLoggerV2) Reset() { s.Set(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard)) } func (s *settableLoggerV2) get() grpclog.LoggerV2 { s.mu.RLock() defer s.mu.RUnlock() return s.log } func (s *settableLoggerV2) Info(args ...interface{}) { s.get().Info(args) } func (s *settableLoggerV2) Infoln(args ...interface{}) { s.get().Infoln(args) } func (s *settableLoggerV2) Infof(format string, args ...interface{}) { s.get().Infof(format, args) } func (s *settableLoggerV2) Warning(args ...interface{}) { s.get().Warning(args) } func (s *settableLoggerV2) Warningln(args ...interface{}) { s.get().Warningln(args) } func (s *settableLoggerV2) Warningf(format string, args ...interface{}) { s.get().Warningf(format, args) } func (s *settableLoggerV2) Error(args ...interface{}) { s.get().Error(args) } func (s *settableLoggerV2) Errorln(args ...interface{}) { s.get().Errorln(args) } func (s *settableLoggerV2) Errorf(format string, args ...interface{}) { s.get().Errorf(format, args) } func (s *settableLoggerV2) Fatal(args ...interface{}) { s.get().Fatal(args) } func (s *settableLoggerV2) Fatalln(args ...interface{}) { s.get().Fatalln(args) } func (s *settableLoggerV2) Fatalf(format string, args ...interface{}) { s.get().Fatalf(format, args) } func (s *settableLoggerV2) V(l int) bool { return s.get().V(l) }