| Implement LoggerBuilder override in etcd integration library. That library is | 
 | generally not designed to be consumed by outside code, and we should migrate | 
 | off of it instead. But that's a future Monogon problem. | 
 |  | 
 | diff -ur io_etcd_go_etcd_tests_v3.orig/integration/cluster.go io_etcd_go_etcd_tests_v3/integration/cluster.go | 
 | --- io_etcd_go_etcd_tests_v3.orig/integration/cluster.go	2023-04-05 10:18:09.220532258 +0200 | 
 | +++ io_etcd_go_etcd_tests_v3/integration/cluster.go	2023-04-05 10:26:36.870901710 +0200 | 
 | @@ -171,6 +170,7 @@ | 
 |   | 
 |  	WatchProgressNotifyInterval time.Duration | 
 |  	CorruptCheckTime            time.Duration | 
 | +	LoggerBuilder func(memberName string) *zap.Logger | 
 |  } | 
 |   | 
 |  type cluster struct { | 
 | @@ -334,6 +335,7 @@ | 
 |  			leaseCheckpointInterval:     c.cfg.LeaseCheckpointInterval, | 
 |  			WatchProgressNotifyInterval: c.cfg.WatchProgressNotifyInterval, | 
 |  			CorruptCheckTime:            c.cfg.CorruptCheckTime, | 
 | +			LoggerBuilder:               c.cfg.LoggerBuilder, | 
 |  		}) | 
 |  	m.DiscoveryURL = c.cfg.DiscoveryURL | 
 |  	if c.cfg.UseGRPC { | 
 | @@ -638,6 +640,7 @@ | 
 |  	leaseCheckpointPersist      bool | 
 |  	WatchProgressNotifyInterval time.Duration | 
 |  	CorruptCheckTime            time.Duration | 
 | +	LoggerBuilder               func(memberName string) *zap.Logger | 
 |  } | 
 |   | 
 |  // mustNewMember return an inited member with the given name. If peerTLS is | 
 | @@ -747,7 +750,11 @@ | 
 |   | 
 |  	m.V2Deprecation = config.V2_DEPR_DEFAULT | 
 |  	m.grpcServerRecorder = &grpc_testing.GrpcRecorder{} | 
 | -	m.Logger = memberLogger(t, mcfg.name) | 
 | +	if mcfg.LoggerBuilder != nil { | 
 | +		m.Logger = mcfg.LoggerBuilder(mcfg.name) | 
 | +	} else { | 
 | +		m.Logger = memberLogger(t, mcfg.name) | 
 | +	} | 
 |  	t.Cleanup(func() { | 
 |  		// if we didn't cleanup the logger, the consecutive test | 
 |  		// might reuse this (t). |